片段按下button

我现在有一个包含片段的活动

[1],[2],[3],[4]

如果按下button[3],则可以将其redirect到[4]

我想实现后退button,如下所示..

当按[4]时,返回到[3]

当按[3]时,返回到[2]

当按[1]时,活动结束();

说到目前的实现,它完成了活动而不是popup碎片。 请您告诉我该怎么做或记住?

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if( keyCode==KeyEvent.KEYCODE_BACK) { finish(); } return super.onKeyDown(keyCode, event); } 

试试这个简单的解决

在您的活动实施onBackPressed

  @Override public void onBackPressed() { if (getSupportFragmentManager().getBackStackEntryCount() > 1) { getSupportFragmentManager().popBackStack(); } else { finish(); } } 

这将工作,如果你想popup每个背部按下顶部的片段。 注意 : – 在将活动添加到活动中时,总是将事务添加到返回栈中以使其正常工作

这对我有效。

当您从活动中调用新的片段时,添加.addToBackStack(空)。

  FragmentTransaction mFragmentTransaction = getFragmentManager() .beginTransaction(); .... mFragmentTransaction.addToBackStack(null); 

将onBackPressed()添加到您的活动

  @Override public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 0) { this.finish(); } else { getFragmentManager().popBackStack(); } } 

最简单的方法:

onResume()

 @Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { // handle back button's click listener Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show(); return true; } return false; } }); } 

编辑1 :如果片段有EditText

 private EditText editText; 

onCreateView()

 editText = (EditText) rootView.findViewById(R.id.editText); 

onResume()

 @Override public void onResume() { super.onResume(); editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { editText.clearFocus(); } return false; } }); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { // handle back button's click listener Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show(); return true; } return false; } }); } 

注意:如果你有EditText的片段,它将工作。

完成

对我来说这是一个可行的解决scheme:

 dialog.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { // DO WHAT YOU WANT ON BACK PRESSED return true; } return false; } }); 

编辑:你可以用getView()replace对话框中的片段。

你可以用这个..为我工作..

看起来像片段[3]没有从视图中删除时,按下后,所以你必须手动做!

首先,不要使用replace(),而是使用remove和add来分开。 看起来好像,replace()不能正常工作。

下一部分是覆盖onKeyDown方法,并在每次按下后退button时删除当前片段。

  @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (getSupportFragmentManager().getBackStackEntryCount() == 0) { this.finish(); return false; } else { getSupportFragmentManager().popBackStack(); removeCurrentFragment(); return false; } } return super.onKeyDown(keyCode, event); } public void removeCurrentFragment() { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.f_id); } 

更好的解决scheme可以是遵循devise模式,使得后退button事件从活动片段传播到主机活动。 所以,就像..如果其中一个活动片段消耗了背压,那么活动就不会对它进行操作,反之亦然。

一种方法是让所有的片段扩展一个基本的片段,它有一个抽象的“boolean onBackPressed()”方法。

 @Override public boolean onBackPressed() { if(some_condition) // Do something return true; //Back press consumed. } else { // Back-press not consumed. Let Activity handle it return false; } } 

跟踪活动内的活动片段,并在其onBackPressedcallback内写入类似这样的内容

 @Override public void onBackPressed() { if(!activeFragment.onBackPressed()) super.onBackPressed(); } } 

这篇文章详细描述了这个模式

我在这种情况下做的是从Activity执行onBackPressed()函数:

 @Override public void onBackPressed() { super.onBackPressed(); FragmentManager fm = getSupportFragmentManager(); MyFragment myFragment = (MyFragment) fm.findFragmentById(R.id.my_fragment); if((myFragmen.isVisible()){ //Do what you want to do } } 

这对你如何工作。

你可以在基本Fragment使用getFragmentManager().popBackStack()来返回。

在片段中按下或处理返回button的解决scheme。

我解决我的问题的方式我相信它也会帮助你:

1.如果你的片段中没有任何编辑文本框,你可以使用下面的代码

这里MainHomeFragment是主要的片段(当我从第二个片段按回button它也将带我MainHomeFragment)

  @Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ MainHomeFragment mainHomeFragment = new SupplierHomeFragment(); android.support.v4.app.FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment); fragmentTransaction.commit(); return true; } return false; } }); } 

2.如果你有另一个片段命名为Somefragment,它有编辑文本框,那么你可以这样做。

 private EditText editText; 

然后在,

 onCreateView(): editText = (EditText) view.findViewById(R.id.editText); 

然后覆盖OnResume,

 @Override public void onResume() { super.onResume(); editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { editTextOFS.clearFocus(); getView().requestFocus(); } return false; } }); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ MainHomeFragment mainHomeFragment = new SupplierHomeFragment(); android.support.v4.app.FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment); fragmentTransaction.commit(); return true; } return false; } }); } 

这就是所有人(amitamie.com):-) 😉

您还需要检查Action_Down或Action_UP事件。 如果你不检查那么onKey()方法将会调用2次。

 getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_BACK) { Toast.makeText(getActivity(), "Back Pressed", Toast.LENGTH_SHORT).show(); return true; } } return false; } }); 

为我工作得很好。

确保添加以下内容:

 if (event.getAction()!=KeyEvent.ACTION_DOWN) return true; 

在代码的onKey块中,以避免事件调用两次。

我用一个方法来改变它的代码片段

  getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit).replace(R.id.content_frame, mContent, mContent.getClass().getSimpleName()).addToBackStack(null) .commit(); 

并为后退button。

 @Override public void onBackPressed() { // note: you can also use 'getSupportFragmentManager()' FragmentManager mgr = getSupportFragmentManager(); if (mgr.getBackStackEntryCount() == 1) { // No backstack to pop, so calling super finish(); } else { mgr.popBackStack(); } } 

重要的是要注意的是我使用1来检查getBackStackEntryCount这是因为如果你不使用它,并使用0用户看不到最后一个返回button。

Interesting Posts