Имам няколко фрагмента в моята дейност
[1], [2], [3], [4], [5], [6]
И при натискане на бутона за връщане трябва да се върна от [2] в [1], ако текущият активен фрагмент е [2], или да не правя нищо в противен случай.
Каква е най-добрата практика да се направи това?
ЕДИТ: Приложението не трябва да се връща в [2] от [3]...[6]
Когато преминавате между фрагменти, извикайте addToBackStack()
като част от вашата FragmentTransaction
:
FragmentTransaction tx = fragmentManager.beginTransation();
tx.replace( R.id.fragment, new MyFragment() ).addToBackStack( "tag" ).commit();
Ако се нуждаете от по-детайлен контрол (т.е. когато някои фрагменти са видими, искате да потиснете клавиша за връщане), можете да зададете OnKeyListener
на родителския изглед на вашия фрагмент:
//You need to add the following line for this solution to work; thanks skayred
fragment.getView().setFocusableInTouchMode(true);
fragment.getView().requestFocus();
fragment.getView().setOnKeyListener( new OnKeyListener()
{
@Override
public boolean onKey( View v, int keyCode, KeyEvent event )
{
if( keyCode == KeyEvent.KEYCODE_BACK )
{
return true;
}
return false;
}
} );
По-скоро бих направил нещо подобно:
private final static String TAG_FRAGMENT = "TAG_FRAGMENT";
private void showFragment() {
final Myfragment fragment = new MyFragment();
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment, fragment, TAG_FRAGMENT);
transaction.addToBackStack(null);
transaction.commit();
}
@Override
public void onBackPressed() {
final Myfragment fragment = (Myfragment) getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not
super.onBackPressed();
}
}
Работя с SlidingMenu и Fragment, представям случая си тук и се надявам да помогна на някого.
Логика при натиснат клавиш [Назад] :
Когато се покаже SlidingMenu, затворете го, няма какво повече да правите.
Или когато се показва 2-ри (или повече) фрагмент, върнете се към предишния фрагмент и няма повече неща за вършене.
Ако SlidingMenu не се показва, текущият фрагмент е №0, направете първоначалното действие с клавиша [Назад].
public class Main extends SherlockFragmentActivity
{
private SlidingMenu menu=null;
Constants.VP=new ViewPager(this);
/Някои неща...
@Override
public void onBackPressed()
{
if(menu.isMenuShowing())
{
menu.showContent(true); /Затваряне на SlidingMenu при показване на менюто
return;
}
else
{
int page=Constants.VP.getCurrentItem();
if(page>0)
{
Constants.VP.setCurrentItem(page-1, true); /Показване на предишния фрагмент до Fragment#0
връщане;
}
иначе
{super.onBackPressed();} //Ако плъзгащото се меню не се показва и текущият фрагмент е #0, направете първоначалното действие на клавиша [Назад]. В моя случай това е излизане от APP
}
}
}