Viewpager2和片段

时间:2020-09-12 17:57:50

标签: java android-studio android-fragments android-viewpager2

ViewPager2 does not support direct child views

我正在尝试使用以下代码在片段之间进行转换,但是在使用viewpager2时出现上述错误。

调用片段1过渡到片段2:

getFragmentManager().beginTransaction().replace(R.id.viewPager2, new q2_fragment()).addToBackStack(null).commit();

主布局中的Viewpager2 XML:

<androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewPager2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="10"
            android:orientation="horizontal"
            android:scaleType="fitXY" />

Main中的实例:

final ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
        viewPager2.setAdapter(new QuestionsActivity.ScreenSlidePagerAdapter(this));
        viewPager2.setUserInputEnabled(false);

如何避免viewpager2出现此错误?

4 个答案:

答案 0 :(得分:1)

很乐意为您提供帮助,请详细说明您的要求。你到底想做什么。

如果您想从 fragment 2 转到 fragment 1,在特定点,那么您应该在片段和活动之间使用 interface,告诉活动移动 {{1} } 到具有 viewpager 的项目。

Interface Pattern for Fragment to Activity

界面

fragment 2

活动

public interface FragmentCallback{
    public void goTo(int pos);
}

答案 1 :(得分:1)

当我将 TabLayout 放在 ViewPager 的结束标记之前时,我遇到了同样的错误

即:

<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
</androidx.viewpager2.widget.ViewPager2>

这是不允许的!

只需删除结束标记并分隔 TabLayout 即可

<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

答案 2 :(得分:0)

正如声明所说

ViewPager2 does not support direct child views
所以永远不要尝试将片段直接添加到 viewPager2 即以下代码行不适用于 viewPager2。

getFragmentManager().beginTransaction().replace(R.id.viewPager2, new q2_fragment()).addToBackStack(null).commit();

如果您尝试在 fragmentManager 的帮助下将片段直接添加到 viewPager2,则会产生异常。 所以只需删除上面的代码行即可摆脱此异常。

答案 3 :(得分:-1)

使用 mPager.setNestedScrollingEnabled(true);