Как вернуться обратно на панели навигации - PullRequest
1 голос
/ 07 февраля 2020

Я создал навигационный ящик с тремя фрагментами. Мне нужно, чтобы домашний фрагмент имел прозрачную панель инструментов, а остальные 2 фрагмента - видимую панель инструментов с заголовком. Это прекрасно работает, как указано в моем коде здесь , но когда пользователь пытается нажать кнопку «Назад» телефона, возникают две ошибки. 1) Когда пользователь находится во третьем фрагменте и нажимает кнопку «назад», данные во фрагменте 3 не заменяются при обратном нажатии, так что в случае фрагмента 2 при обратном нажатии пользователь все еще может видеть часть данных фрагмента 3. 2) При непрерывном обратном нажатии я получаю эту ошибку из моего первого фрагмента.

java.lang.IllegalStateException: Fragment already added: CustomerFragment{42208250 #0 id=0x7f0900ef frag1}
        at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1916)
        at android.support.v4.app.BackStackRecord.executePopOps(BackStackRecord.java:828)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2622)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5756)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
        at dalvik.system.NativeStart.main(Native Method)

1 Ответ

0 голосов
/ 07 февраля 2020

Вы должны управлять транзакцией фрагмента для вашего ящика в onBackPress () вашей проверки MainActivity ниже кода для вашей помощи;)

@Override
    public void onBackPressed() 
    {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } 
        else if (getSupportFragmentManager().getBackStackEntryCount() > 1)
        {
                Log.e(TAG, "onBackStackChanged if: " + getSupportFragmentManager().getBackStackEntryCount());
                getSupportFragmentManager().popBackStack();
        }
        else
        {
            super.onBackPressed();
        }
    }
...