ViewPager inside BottomSheetDialogFragment

I am trying to set the viewpager inside a BottomSheetDialogFragment, but always with the same result:

java.lang.IllegalStateException: The fragment does not have the form

setupDialog

The code:

@Override public void setupDialog(Dialog dialog, int style) { Log.d(TAG, "setupDialog"); super.setupDialog(dialog, style); View root = View.inflate(getContext(), R.layout.fragment_daily_detail, null); dialog.setContentView(root); CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) ((View) root.getParent()).getLayoutParams(); CoordinatorLayout.Behavior behavior = layoutParams.getBehavior(); if (behavior != null && behavior instanceof BottomSheetBehavior) { bottomSheetBehavior = (BottomSheetBehavior) behavior; bottomSheetBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback); bottomSheetBehavior.setPeekHeight((int) getResources().getDimension(R.dimen.fragment_forgot_password_min_height)); Log.d(TAG, "State: " + bottomSheetBehavior.getState()); imageClose = root.findViewById(R.id.imageViewClose); textViewTitle = (TextView) root.findViewById(R.id.textViewTitle); peekLayout = root.findViewById(R.id.peekLayout); tabLayout = (TabLayout) root.findViewById(R.id.tabs); viewPager = (ViewPager) root.findViewById(R.id.viewPager); recyclerView = (RecyclerView) root.findViewById(R.id.recyclerView); timesheetDay = timesheetDayList.get(pageNumber); imageClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); } }); textViewTitle.setText(timesheetDay.getDate()); sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); viewPager.setAdapter(sectionsPagerAdapter); tabLayout.setupWithViewPager(viewPager); } } 

FragmentPagerAdapter

The code:

 public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return PageFragment.getInstance(timesheetDayList.get(position)); } @Override public int getCount() { return timesheetDayList.size(); } @Override public CharSequence getPageTitle(int position) { return timesheetDayList.get(position).getDate(); } } 

SPECIFICATION Code:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mainLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background_material_light" android:clickable="true" android:orientation="vertical" tools:context=".ui.dialogs.bottomsheets.ForgotUsernameFragment"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="0dp" android:layout_marginTop="0dp"> <RelativeLayout android:id="@+id/peekLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="?actionBarSize" android:background="@color/colorPrimary" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/imageViewClose" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:padding="16dp" app:srcCompat="@drawable/ic_close_white_24dp" tools:ignore="MissingPrefix" tools:src="@drawable/ic_close_white_24dp" /> <TextView android:id="@+id/textViewTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Daily Detail" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="@color/colorWhite" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/linearLayout2" android:orientation="vertical"> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" app:tabMode="scrollable" /> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> </RelativeLayout> </RelativeLayout> 

It would be very helpful for me if anyone knows something about this implementation.

Greetings and thanks in advance!

+10
android android-viewpager bottom-sheet
source share
3 answers

UPDATED

I solved the problem of inflating the view in "onCreateView ()". Anyway, I configured RecyclerView inside the ViewPager, and the RecyclerView vertical scrolling is very unstable, sometimes it works, and sometimes not, so I'll try to make this screen differently.

 @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateview"); View root = inflater.inflate(R.layout.fragment_daily_detail, container); mImageClose = root.findViewById(R.id.imageViewClose); mTextViewTitle = (TextView) root.findViewById(R.id.textViewTitle); mPeekLayout = root.findViewById(R.id.peekLayout); mTabLayout = (TabLayout) root.findViewById(R.id.tabs); mViewPager = (ViewPager) root.findViewById(R.id.viewPager); mImageClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getDialog().dismiss(); } }); mTextViewTitle.setText("Daily detail"); mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); mViewPager.setAdapter(mSectionsPagerAdapter); mTabLayout.setupWithViewPager(mViewPager); mViewPager.setCurrentItem(mPageNumber); mPeekLayout.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { BottomSheetDialog dialog = (BottomSheetDialog) getDialog(); FrameLayout bottomSheet = (FrameLayout) dialog.findViewById(android.support.design.R.id.design_bottom_sheet); mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); // gets called after layout has been done but before display // so we can get the height then hide the view int height = mPeekLayout.getHeight(); Log.d(TAG, "Height: " + height); mBottomSheetBehavior.setPeekHeight(height); mBottomSheetBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback); } }); return root; } 
+10
source share

Try changing your code as shown below:

 ... LayoutInflater inflater = getActivity().getLayoutInflater(); root = inflater.inflate(R.layout.fragment_daily_detail, null); ... sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); //Use getSupportFragmentManager() instead of getChildFragmentManager(), ... 
+1
source share

Simply the best. Just use this library and get rid of all the problems you face. I found this after a long struggle. For Bottom Sheet and BottomSheet dialogs with viewpager

0
source share

All Articles