片段按下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。