Попробую заменить фрагменты - PullRequest
1 голос
/ 26 февраля 2020

У меня есть навигационный вид снизу, и я хочу заменить два фрагмента, когда нажимаю на вкладку, как показано ниже.

fun onCreate() {
        replaceFragment(FragmentFirst())
        replaceFragment(FragmentSecond())
        replaceFragment(FragmentFirst())
        replaceFragment(FragmentSecond())
        replaceFragment(FragmentFirst())
    }

Если supportmanager не находит фрагмент, то замените и добавьте в backstack, если supportmanager имеет фрагмент, затем замените только существующий фрагмент, как показано ниже.

  fun replaceFragment(fragment: Fragment, addToBackStack: Boolean) {
    val transaction = supportFragmentManager.beginTransaction()
    val fragmentFromStack = supportFragmentManager.findFragmentByTag(fragment.javaClass.toString())

    if (fragmentFromStack == null) {
        transaction.replace(R.id.container, fragment, fragment.javaClass.toString())
        transaction.addToBackStack(null)
    } else {
        transaction.replace(R.id.container, fragmentFromStack)
    }
    transaction.commit()
}

Проблема возникает, когда я нажимаю назад кнопка, когда FragmentFirst () открыт.

IllegalStateException: Фрагмент, уже добавленный во фрагмент tabhost

Я не понимаю, когда возникает проблема. Есть ли какое-либо решение или альтернативный способ навигации, как этот.

2020-02-27 13:39:50.751 7132-7132/com.navigation.android E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.navigation.android, PID: 7132
    java.lang.IllegalStateException: Fragment already added: FragmentFirst{d2a554d (20ca6825-e304-4157-8514-353a57c40268) id=0x7f080059 class com.navigation.android.tabs.firsttab.FragmentFirst}
        at androidx.fragment.app.FragmentManagerImpl.addFragment(FragmentManagerImpl.java:1379)
        at androidx.fragment.app.BackStackRecord.executePopOps(BackStackRecord.java:465)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2076)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.popBackStackImmediate(FragmentManagerImpl.java:310)
        at androidx.fragment.app.FragmentManagerImpl.popBackStackImmediate(FragmentManagerImpl.java:253)
        at androidx.fragment.app.FragmentManagerImpl.handleOnBackPressed(FragmentManagerImpl.java:233)
        at androidx.fragment.app.FragmentManagerImpl$1.handleOnBackPressed(FragmentManagerImpl.java:108)
        at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.java:189)
        at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.java:286)
        at android.app.Activity.onKeyUp(Activity.java:3169)
        at android.view.KeyEvent.dispatch(KeyEvent.java:3383)
        at android.app.Activity.dispatchKeyEvent(Activity.java:3452)
        at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:122)
        at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:84)
        at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:140)
        at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:558)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2814)
        at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:563)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6055)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5910)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5363)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5416)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5382)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5541)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5390)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5598)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5363)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5416)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5382)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5390)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5363)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5416)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5382)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5574)
        at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:5743)
        at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3407)
        at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2854)
        at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2845)
        at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3384)
        at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
        at android.os.MessageQueue.nativePollOnce(Native Method)
2020-02-27 13:39:50.751 7132-7132/com.navigation.android E/AndroidRuntime:     at android.os.MessageQueue.next(MessageQueue.java:326)
        at android.os.Looper.loop(Looper.java:181)
        at android.app.ActivityThread.main(ActivityThread.java:7099)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

1 Ответ

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

Вы должны проверить каждый фрагмент перед загрузкой в ​​представлении, а затем решить, добавлять ли их или нет, и приведенный выше код тоже работает нормально.

if(fragmentName.isAdded(){
return;
}
...