BottomSheetDialogFragment中的ViewPager

我试图在BottomSheetDialogFragment中设置一个viewpager,但总是有相同的结果:

java.lang.IllegalStateException:Fragment没有视图

setupDialog

码:

@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

码:

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

布局代码:

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

如果有人知道这个实现的话,对我来说是非常有用的。

欢呼声和感谢提前!

Solutions Collecting From Web of "BottomSheetDialogFragment中的ViewPager"

更新

我解决了膨胀在“onCreateView()”视图的问题。 无论如何,我已经在ViewPager中设置了一个RecyclerView,RecyclerView的垂直滚动非常不稳定,有时可以工作,有时不会,所以我会尝试以另一种方式做这个屏幕。

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

尝试改变你的代码,如下所示:

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