2016-04-12 23 views
7

Sto cercando di impostare un viewpager all'interno di un BottomSheetDialogFragment ma sempre con lo stesso risultato:ViewPager all'interno BottomSheetDialogFragment

java.lang.IllegalStateException: Frammento non ha una vista

setupDialog

Codice:

@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

Codice:

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

LAYOUT Codice:

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

Sarebbe molto utile per me se qualcuno sa qualcosa su questo impl ementation.

Saluti e grazie in anticipo!

+0

Posso vedere 'SectionsPagerAdapter'? – pRaNaY

risposta

7

AGGIORNATO

ho risolto il problema gonfiare la vista in "onCreateView()". Ad ogni modo, ho impostato un RecyclerView all'interno del ViewPager e lo scroll verticale di RecyclerView è molto instabile, a volte funziona e talvolta no, quindi proverò a farlo in un altro modo.

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

Fantastico. Mi fa risparmiare la giornata :) –

1

tenta di modificare il codice come di seguito:

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

Stesso risultato :(Comunque grazie – Buntupana

+0

, vedi il mio codice modificato, che ti aiuta – pRaNaY

+0

non c'è getSupportFragmentManager() in BottomSheetDialogFragment, solo getFragmentManager(). L'ho già provato. Il risultato era java.lang.IllegalArgumentException: No vista trovata per id 0x7f0e010e. Penso che per impostare un frammento all'interno di un altro frammento dovrei usare getChildFragmentManager(), non è vero? – Buntupana