Подтвердить что ты не робот

Обработка стопки фрагмента с помощью навигационного ящика

Я использую навигационный ящик и хорошо работаю. Таким образом, я вызываю фрагмент в щелчке на панели навигации, и он также работает, и еще больше я вызываю другой фрагмент из фрагмента домашней страницы и поддерживаю задний стек для каждого фрагмента, но проблема возвращается с дочернего фрагмента, я не могу перейти к Фрагмент домашней страницы и только что вышел из приложения. Я не хочу этого. Что я хочу Нажмите на

Navigation Drawer->HomePageFragment->AnotherChild Fragment(On List Item click of HomePageFragment)

но на задней панели нажата, не перейдя к Homepage фрагментировать его непосредственно с помощью приложения. Вот мой код: (In Fragment Activity with Navigation Drawer)

class SlideitemListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        updateDisplay(position);
    }

}

private void updateDisplay(int position) {
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new ScheduleFragment();
        break;
    case 1:
        fragment = new Result_Fragment();
        break;
    case 2:
        fragment = new Live_Match_Fragment();
        break;
    case 3:
        // fragment = new Live_Match_Fragment();
        break;

    case 4:
        fragment = new Team_Fragment();
        break;
    default:
        break;
    }

    if (fragment != null) {

        fragmentManager = getFragmentManager();
        fragmentManager.popBackStackImmediate("0", 0);
        int count = fragmentManager.getBackStackEntryCount();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        fragmentTransaction.replace(R.id.frame_container, fragment)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .addToBackStack(String.valueOf(count)).commit();
        Log.e("Count in Activiy", ""+count);

        // update selected item and title, then close the drawer
        setTitle(menutitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }

}

Теперь в BackPressed() в FragmentActivity.

@Override
public void onBackPressed() {
    if (fragmentManager.getBackStackEntryCount() <= 1) {
        finish();

        return;
    }
    super.onBackPressed();
}

Теперь вызов другого дочернего фрагмента из Homepage фрагмента на Listview выберите пункт.

 team_lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            TeamDetailFragment myDetailFragment = new TeamDetailFragment();
            FragmentManager fragmentManager = getFragmentManager();
            int count = fragmentManager.getBackStackEntryCount();
            Log.e("Count in Fragment", "" + count);
            FragmentTransaction fragmentTransaction = fragmentManager
                    .beginTransaction();
            fragmentTransaction
                    .replace(R.id.frame_container, myDetailFragment)
                    .setTransition(
                            FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .addToBackStack(String.valueOf(count)).commit();

        }
    });

Итак, кто-нибудь знает, тогда помогите мне. Помощь будет оценена.

4b9b3361

Ответ 2

Есть проблема с вложенными фрагментами в android https://code.google.com/p/android/issues/detail?id=40323

Android не справляется с обратным нажатием, если транзакции были во вложенных фрагментах. Чтобы превзойти это, я использую следующее исправление внутри My Activity

@Override
public void onBackPressed() {
    // If the fragment exists and has some back-stack entry
    if (myFragment != null && myFragment.getChildFragmentManager().getBackStackEntryCount() > 0) {
        // Get the fragment fragment manager - and pop the backstack
        myFragment.getChildFragmentManager().popBackStack();
    }
    // Else, nothing in the direct fragment back stack
    else {
        // Let super handle the back press
        super.onBackPressed();
    }
}

Ответ 3

Я решил следующее:

1-е решение

@Override
public void onBackPressed() {
    FragmentManager fragmentManager = getFragmentManager();
    int backCount = fragmentManager.getBackStackEntryCount();

    if(backCount > 1) {
        super.onBackPressed();
    } else {
        finish();
    }
}

2-е решение

@Override
public void onBackStackChanged() {
    FragmentManager fragmentManager = getFragmentManager();
    int backCount = fragmentManager.getBackStackEntryCount();

    if(backCount == 0) {
        finish();
    }
}

Это позволяет использовать стек Android при замене фрагмента:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, yourFragment)
    .addToBackStack(null).commit();

Ответ 4

Когда вы нажмете кнопку "Назад" внутри вашего фрагмента, метод onBackPressed() вашей активности будет вызываться, если вы заявили, что... Так что обратная кнопка возврата для фрагментов в ящике навигации может быть таким образом.

MainActvity

     public static boolean isMainActivityShown ;
     public static boolean isFragment1Shown=false ;
     public static boolean isFragment2Shown=false ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        isMainActivityShown=true  //inside onCreate method put isMainActivityShown true
. 
. 
.


 {
               Fragment currentFragment = new Fragment1();
               isMainActivityShown=false;   //when moving to fragment1 
               isFragment1Shown=true;
               frgManager = getFragmentManager();
               frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
                                        .commit();
 }
.
.
}



  @Override
        public void onBackPressed() {

            if(isMainActivityShown)
            {
                finish();
            }
            else if(isFragment1Shown)
            {
               //write the code to handle back button when you are in Fragment1
            }
           else if(isFragment2Shown)
            {  //When you are in Fragment 2 pressing back button will move to fragment1
                Fragment currentFragment = new Fragment1();
                isFragment2Shown=false;
                isFragment1Shown=true;

                FragmentManager frgManager;
                frgManager = getFragmentManager();
                frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
                        .commit();
            }

            }

Fragment1

Fragment currentFragment = new Fragment2();
MainActivity.isFragment1Shown=false;
MainActivity.isFragment2Shown=true;
frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
                                    .commit();

Ответ 5

Теперь вы можете заменить finish() для фрагментатора .popBackStack(), метода android.support.v4.app.FragmentManager