Как использовать кнопку onBackPress во фрагменте на Android - PullRequest
0 голосов
/ 06 октября 2019

В моем приложении у меня есть NavigationView и в этом NavigationView я установил меню для открытия некоторых fragments!

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="320dip"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#000"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/tester_drawer_header"
    app:itemIconTint="#fff"
    app:itemTextColor="#fff"
    app:menu="@menu/tester_drawer_main"/>

Я хочу, когда нажмитев этом меню откройте один fragment, и я хочу, чтобы перейти к вложенному fragments и нажать onBack кнопку, чтобы открыть первый фрагмент не открывать backStack fragments!

Я пишу ниже коды, но после нажатия на спину button назад fragments из backStack, но я хочу просто сначала открыть fragment!

Коды MyActivity:

public class TesterDashboardActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tester_dashboard);

        loadFragment(new TesterTestListFragment(), userName);
}

    @Override
    public void onBackPressed() {
        fragmentBackCount = getSupportFragmentManager().getBackStackEntryCount();

        if (fragmentBackCount <= 1) {
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                drawer.closeDrawer(GravityCompat.START);
            } else {
                //finishAffinity();
                super.onBackPressed();
            }
        } else {
            getSupportFragmentManager().popBackStack();
        }
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case R.id.nav_home:
                loadFragment(new TesterTestListFragment(), userName);
                break;
            case R.id.nav_billing:
                loadFragment(new TesterFinanceFragment(), context.getString(R.string.menu_billing));
                break;
            case R.id.nav_edit_profile:
                loadFragment(new TesterProfileFilterEditFragment(), context.getString(R.string.menu_edit_profile));
                break;
            case R.id.nav_bank:
                loadFragment(new TesterShebaFragment(), context.getString(R.string.menu_bank));
                break;
            case R.id.nav_report:
                loadFragment(new TesterReportsFragment(), context.getString(R.string.menu_report));
                break;
            case R.id.nav_setting:
                loadFragment(new TesterSettingFragment(), context.getString(R.string.menu_setting));
                break;
        }
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    public void loadFragment(Fragment fragment, String toolbarTitle) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.replace(R.id.testerFragment, fragment,TAG_FRAGMENT);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

        toolbar.setTitle(toolbarTitle);
    }

Как это исправить?

Ответы [ 2 ]

1 голос
/ 06 октября 2019

В вашем коде я нашел, когда fragmentBackCount>1 вы просто вызываете getSupportFragmentManager().popBackStack(); один раз, так что вы увидите верхний фрагмент в backstack. Я думаю, вам нужно вызвать getSupportFragmentManager().popBackStack();, фрагментBackCount-1 раз, чтобы достичь первого фрагмента

 else {
       for(int i=0;i<fragmentBackCount-1;i++)
           getSupportFragmentManager().popBackStack();
      }
0 голосов
/ 07 октября 2019

Когда вы переходите между фрагментами, вызывайте addToBackStack () как часть вашего

  FragmentTransaction:

FragmentTransaction tx = fragmentManager.beginTransation();
tx.replace( R.id.fragment, new MyFragment() ).addToBackStack( "tag" ).commit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...