android - 如何处理2个FragmentTransaction

标签 android android-fragments error-handling transactions

我的应用有问题,其中包含2个片段布局
当我想从抽屉项目单击同时更改两个片段的
它给我这样的错误

2019-06-04 22:22:03.572 24088-24088/com.example.android.madbaloon3 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android.madbaloon3, PID: 24088
    java.lang.IllegalStateException: commit already called
        at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:669)
        at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:637)
        at com.example.android.madbaloon3.MainActivity.onNavigationItemSelected(MainActivity.java:195)
        at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:170)
        at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
        at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
        at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
        at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:352)
        at android.view.View.performClick(View.java:6261)
        at android.view.View$PerformClick.run(View.java:23752)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6776)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

首先,我在类里面设置了片段内容

    private MapFragment mapFragment = new MapFragment();
    private DataFragment dataFragment = new DataFragment();
    private InfoFragment infoFragment = new InfoFragment();
    private AboutFragment aboutFragment = new AboutFragment();
    private EmptyFragment emptyFragment = new EmptyFragment();


private FragmentTransaction transaction_top = getSupportFragmentManager().beginTransaction();
private FragmentTransaction transaction_bottom = getSupportFragmentManager().beginTransaction();

然后在oncreate我设置默认片段这样
transaction_bottom.replace(R.id.bottomFragment, dataFragment);
        transaction_bottom.commit();
        bottom_fragment_name="dataFragment";


        transaction_top.replace(R.id.topFragment, mapFragment);
        transaction_top.commit();
        top_fragment_name="mapFragment";


然后我想在有人点击抽屉项目时更改两个片段
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {


        switch (item.getItemId()) {
            case R.id.nav_map:

                transaction_top.replace(R.id.topFragment, mapFragment);
                transaction_top.commit();

                break;
            case R.id.nav_about:


                transaction_top.replace(R.id.topFragment,aboutFragment);
                transaction_top.commit();


                transaction_top.replace(R.id.bottomFragment,infoFragment);
                transaction_bottom.commit();


            default:
                break;

        }

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

片段loyout(我的意思是content_main.xml)
        <FrameLayout
            android:id="@+id/topFragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="25"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout="@layout/fragment_map" />

        <FrameLayout
            android:id="@+id/bottomFragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout="@layout/fragment_info"
            />

我一直在尝试删除交易中的片段,然后再替换它,但是它不起作用

最佳答案

您的错误状态:

java.lang.IllegalStateException: commit already called



这意味着,您正在尝试在 Activity 中某处两次提交FragmentTransaction。

您将可以在onNavigationItemSelectedcase R.id.nav_about中看到已编写此代码。
transaction_top.replace(R.id.bottomFragment,infoFragment);
transaction_bottom.commit();

在这种情况下,您之前已经提交了transaction_bottom,但是在这里您尝试再次进行操作而不对事务进行任何更改。所以您必须将其更改为
transaction_bottom.replace(R.id.bottomFragment,infoFragment);
transaction_bottom.commit();

关于android - 如何处理2个FragmentTransaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56450876/

相关文章:

android - ViewPager中Fragment来到屏幕时的方法

android - 尝试将Youtube Data API集成到android应用中时出现com.android.dex.DexException

java - 格式化我的系统后未安装应用程序且未签署应用程序

android - 像 facebook 一样拉动刷新和加载更多 ListView

Haskell:预期的惰性,为什么要评估它?

android - Cocos2d-x C++开发工具(无需完整的IDE)

java - 计时器& fragment ,旋转后恢复状态

android - 在 MVP android 应用程序中的演示者之间进行通信

ios - 它显示了一个错误,表明 “cannot convert value of type ' Int.Type'与预期的参数类型Int无关。

c# - 是否可以捕获对象引用上的哪个对象未设置为对象的实例。错误