Viewpager2和Fragments

7
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" />

在主函数中的实例化:

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

我该如何避免使用viewpager2时出现的错误?

5个回答

5

当我将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" />


1

很高兴能够帮助您,请详细说明您的要求。您想做什么。

如果您想在特定点从片段1转到片段2,则应在片段和活动之间使用接口,告诉活动将视图分页器移动到具有片段2的项目。

Fragment与Activity之间的接口模式

接口

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

活动

public class MyActivity extends AppCompatActivity implements MyStringListener{

  @Override
  public void goTo(int pos){
        yourviewpagerAdapter.setCurrentItem(pos);
  }

}

public class Fragment1 {

        private FragmentCallback callBack;

        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            try {
                callBack = (FragmentCallback) context;
            } catch (ClassCastException castException) {
                /** The activity does not implement the listener. */
            }
        }

       

        public void someEvent() {
            if(callBack!=null) {
                callBack.goTo(1);
            } 
        }           

    }

感谢您的回答。除了我在这篇帖子中提到的内容,我不记得我当时面临的具体问题是什么了,但我相信接口是前进的道路,最终我在我正在开发的应用程序中采用了它。 - M A F
@MAF 希望这个答案对你有帮助,如果你能接受这个答案,我会非常感激。 - rahat

0

正如这个语句所说

ViewPager2不支持直接子视图
所以永远不要尝试将fragment 直接添加到viewPager2中 即以下代码行将无法与viewPager2一起使用。

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

如果您尝试使用fragmentManager将片段直接添加到viewPager2中,则会产生异常。因此,只需删除上述代码行即可摆脱此异常。


0
假设从Fragment_1Fragment_2

Fragment_1中的按钮点击事件内部

Bundle result = new Bundle(); result.putString("bundleKey", "result"); getParentFragmentManager().setFragmentResult("requestKey", result);

Fragment_2onCreate(Bundle savedInstanceState) 方法中

getParentFragmentManager().setFragmentResultListener("requestKey", this, new FragmentResultListener() {
 @Override public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle bundle)
 { 
supported String result = bundle.getString("bundleKey"); System.out.println("----------------------------"+result); 
}
 });

https://developer.android.com/guide/fragments/communicate#pass-between-fragments


https://developer.android.com/guide/fragments/communicate#pass-between-fragments - StackJ

-1
使用mPager.setNestedScrollingEnabled(true);

1
请提供更多细节:为什么/如何您的建议起作用?它是如何解决原始问题的? - tmilar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接