如何在导航抽屉主持的视图分页器中更改片段

时间:2018-11-14 12:24:48

标签: android android-fragments android-viewpager navigation-drawer fragmenttransaction

我有一个带有导航抽屉的Android应用。单击每个抽屉项目时,它将显示在viewpager和选项卡布局中托管的两个片段。 我无法在选定的导航抽屉项目之间切换,因为它引发了IllegalStateException。
我无法弄清楚为什么content_main会托管布局。

更改片段的代码:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_main, fragment);
ft.commit();


app_bar_main.xml的XML代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/coordinator_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF"
tools:context=".activities.MainActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"

    >

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar_main"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:tabGravity="fill"
        app:tabIndicatorColor="@color/colorAccent"
        app:tabIndicatorHeight="3dp"
        app:tabMode="fixed"
        app:tabSelectedTextColor="@color/colorAccent"
        app:tabTextColor="#FFFFFF" />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:layout_marginTop="108dp">

    <include layout="@layout/content_main" />
</android.support.v4.view.ViewPager>


content_main.xml的XML代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".activities.MainActivity"
tools:showIn="@layout/app_bar_main">



LogCat的错误消息转储:

2018-11-14 14:19:22.741 27690-27690/com.lomakuit.phwandoorganiser     E/FragmentManager: No view found for id 0x7f08008a (com.lomakuit.phwandoorganiser:id/content_main) for fragment TicketCollectorsFragment{570be2e #3 id=0x7f08008a}
2018-11-14 14:19:22.741 27690-27690/com.lomakuit.phwandoorganiser E/FragmentManager: Activity state:
2018-11-14 14:19:22.788 27690-27690/com.lomakuit.phwandoorganiser E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.lomakuit.phwandoorganiser, PID: 27690
java.lang.IllegalArgumentException: No view found for id 0x7f08008a (com.lomakuit.phwandoorganiser:id/content_main) for fragment TicketCollectorsFragment{570be2e #3 id=0x7f08008a}
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1454)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    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:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)


我不确定如何在片段之间切换。
enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

your_activity.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".activities.MainActivity"
tools:showIn="@layout/app_bar_main">


<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/content_main">
    </android.support.constraint.ConstraintLayout>

类似这样的事情。您的content_main ID(某些布局)必须保存在您要替换的活动内(而不是xml父布局的ID [那么您怎么能从中调用多个片段?]。)