【问题标题】:Viewpager2 and FragmentsViewpager2 和片段
【发布时间】:2020-09-12 17:57:50
【问题描述】:
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 出现这个错误?

【问题讨论】:

    标签: java android android-fragments android-viewpager2


    【解决方案1】:

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

    如果你想从fragment 1 转到fragment 2,那么你应该在片段和活动之间使用interface,告诉活动将viewpager 移动到具有@987654326 的项目@。

    Interface Pattern for Fragment to 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);
                } 
            }           
    
        }
    

    【讨论】:

    • 感谢您的回答。除了我在这篇文章中所说的之外,我不记得我面临的具体问题,但我确实相信接口是要走的路,也是我最终在我正在开发的应用程序中使用的。
    • @MAF 希望答案对您有所帮助,如果您能接受答案,将不胜感激。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      正如声明所说

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

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

      如果您尝试在fragmentManager 的帮助下将片段直接添加到viewPager2,则会产生异常。 所以只要去掉上面几行代码就可以摆脱这个异常了。

      【讨论】:

        【解决方案4】:

        让我们说从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

        【解决方案5】:

        使用 mPager.setNestedScrollingEnabled(true);

        【讨论】:

        • 请提供更多详细信息:您的建议为何/如何起作用?它如何解决最初的问题?
        猜你喜欢
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        相关资源
        最近更新 更多