简体   繁体   中英

Viewpager2 and Fragments

ViewPager2 does not support direct child views

I'm trying to transition between fragments using the following code but I get the above error when using viewpager2.

Call in fragment 1 to transition to fragment 2:

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

Viewpager2 XML in Main Layout:

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

Instantiation in Main:

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

How do I avoid this error with viewpager2?

Would be happy to help, please elaborate on your requirement. What exactly you want to do.

If you want to go to fragment 2 from fragment 1 , at a particular point then you should use interface between fragment and activity, to tell the activity to move the viewpager to the item which has fragment 2 .

Interface Pattern for Fragment to Activity

Interface

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

Activity

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);
            } 
        }           

    }

I got the same error when I put the TabLayout before ViewPager 's closing tag

That is:

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

Which is not Allowed!

Just Removing the ending tag and separating TabLayout will work

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

As the statement says

ViewPager2 does not support direct child views
So never try to add the fragment to viewPager2 directly ie the following lines of code will not work with viewPager2.

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

The exception is produced if you try to add fragment directly to viewPager2 with the help of fragmentManager . So simply remove the above lines of code to get rid of this exception.

Lets Say From Fragment_1 to Fragment_2 :

In side the button click in Fragment_1

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

In side the Fragment_2 onCreate(Bundle savedInstanceState) method

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

使用 mPager.setNestedScrollingEnabled(true);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM