Reputation: 301
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?
Upvotes: 8
Views: 8582
Reputation: 1
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
Upvotes: 0
Reputation: 55
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" />
Upvotes: 5
Reputation: 51
As the statement says
ViewPager2 does not support direct child views
So never try to add the fragment to viewPager2 directly
i.e 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.
Upvotes: 0
Reputation: 2056
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);
}
}
}
Upvotes: 1