简体   繁体   English

Android-在BottomSheetDialog片段中实现了附加有ViewPager的BottomNavigation View时出现奇怪的错误

[英]Android -Getting weird error on Implementing BottomNavigation View with ViewPager attached to it in BottomSheetDialog Fragment

I have a BottomSheetDialogFragment , TicketDashboard which has following code 我有一个BottomSheetDialogFragment ,TicketDashboard具有以下代码

Injecting views with ButterKnife, getting error when setting adapter to ViewPager. 使用ButterKnife注入视图,将适配器设置为ViewPager时出错。 Error says no view available for R.id.ticket_dashboard_view_pager . 错误表明R.id.ticket_dashboard_view_pager没有可用的视图 Stacktrace attached at end. Stacktrace附加在末尾。

@Bind(R.id.ticket_dashboard_view_pager)
ViewPager mViewPager;

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), R.layout.fragment_ticket_dashboard, null);
    dialog.setContentView(contentView);
    ButterKnife.bind(this, contentView);

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
    CoordinatorLayout.Behavior behavior = params.getBehavior();

    if( behavior != null && behavior instanceof BottomSheetBehavior ) {
        mBottomSheetBehavior = (BottomSheetBehavior) behavior;
        mBottomSheetBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback);
        mBottomSheetBehavior.setPeekHeight(470);
    }
}

@Override
public void onStart(){
    super.onStart();
    mToolBar.setTitle("Ticket# " + ticket.getTicketNumber());
    mToolBar.setNavigationIcon(getActivity().getDrawable(R.drawable.ic_arrow_upward_white_24dp));
    mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(isExpanded) {
                mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
            }else{
                mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        }
    });
    setupViewPager();
    mBottomNavigation.getMenu().getItem(0).setChecked(true);
}

private void setupViewPager(){
    setUpPages();
    mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager());
    **mViewPager.setAdapter(mPagerAdapter);** // Line at which iam getting error
    mViewPager.addOnPageChangeListener(this);
}

XML XML

<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"
xmlns:design="http://schema.android.com/apk/res/android.support.design"
android:layout_width="match_parent"
android:layout_height="match_parent">

//ToolBar

<android.support.design.widget.AppBarLayout
    android:id="@+id/toolbar_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="5dp"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/ticket_dashboard_view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/toolbar_layout"
    android:background="@android:color/transparent"
    android:focusable="true"
    android:focusableInTouchMode="true" />

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemBackground="@color/colorPrimary"
    app:itemIconTint="@drawable/nav_item_color_state"
    app:itemTextColor="@drawable/nav_item_color_state"
    app:menu="@menu/ticket_dashboard_menu" />
</RelativeLayout>

StackTrace 堆栈跟踪

Process: io.webguru.ticketing, PID: 29663 java.lang.IllegalArgumentException: No view found for id 0x7f0f01ca (io.webguru.ticketing:id/ticket_dashboard_view_pager) for fragment TicketOverviewFragment{bb97f0f #4 id=0x7f0f01ca} 进程:io.webguru.ticketing,PID:29663 java.lang.IllegalArgumentException:未找到ID为0x7f0f01ca的视图(io.webguru.ticketing:id / ticket_dashboard_view_pager)片段TicketOverviewFragment {bb97f0f#4 id = 0x7f0f01ca}

Thank you 谢谢

Try to replace getFragmentManager with getChildFragmentManager() 尝试将getFragmentManager替换为getChildFragmentManager()

private void setupViewPager(){
    setUpPages();
    mPagerAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager());
    **mViewPager.setAdapter(mPagerAdapter);** // Line at which iam getting error
    mViewPager.addOnPageChangeListener(this);
}

Instead of inflating layout on setUpDialog, do in onCreateView 不要在setUpDialog上扩大布局,而在onCreateView中进行

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final View mContentView = inflater.inflate(R.layout.layout_trophy, null);

        initUI(mContentView);

        mContentView.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);
                        mBehavior = BottomSheetBehavior.from(bottomSheet);

                        if (mBehavior != null && mBehavior instanceof BottomSheetBehavior) {
                            mBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback);
                            int height = LayoutUtils.getScreenHeight(getActivity());
                            final double desiredHeight = PurchaseConstants.SLIDING_ANCHOR_POINT * height;
                            mContentView.getLayoutParams().height = height;
                            mBehavior.setPeekHeight((int) desiredHeight);
                        }
                    }


                });

        return mContentView;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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