26

Tworzę model BottomSheetDialogFragment i chcę dostosować jego maksymalną wysokość rozwinięcia. Jak mogę to zrobić? Mogę pobrać BottomSheetBehaviour, ale wszystko, co mogę znaleźć, to seter dla wysokości podglądu, ale nic dla rozszerzonej wysokości.BottomSheetDialogFragment - Jak ustawić wysokość rozwiniętą (lub minimalne przesunięcie górne)

public class DialogMediaDetails extends BottomSheetDialogFragment 
{ 
    @Override 
    public void setupDialog(Dialog dialog, int style) 
    { 
     super.setupDialog(dialog, style); 
     View view = View.inflate(getContext(), R.layout.dialog_media_details, null); 
     dialog.setContentView(view); 

     ... 

     View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet); 
     BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); 
     behavior.setPeekHeight(...); 
     // how to set maximum expanded height???? Or a minimum top offset? 

    } 
} 

EDIT

Dlaczego muszę to? Bo pokazują BottomSheet Dialog w pełnej aktywności ekranu i wygląda to źle, jeśli BottomSheet pozostawia przestrzeń na górze ...

+0

znalazłeś rozwiązanie? – abat

+0

Chciałbym wiedzieć, że ** jak ustawić "maks. Wysokość" dla "modalnego dolnego arkusza"? **. Potrzebuję mojego modalnego dolnego arkusza, aby przejść do ekranu pół ekranu i nigdy do góry, nawet po przeciągnięciu ... Jakieś wskazówki? – eRaisedToX

Odpowiedz

5

BIG UPDATE Unikanie kod powielony ja daję link do full answer w którym cię może znaleźć wszystkie wyjaśnienia, jak uzyskać pełne zachowanie, takie jak Mapy Google.


Chcę dostosować to maksymalna wysokość rozszerzony. Jak mogę to zrobić?

Zarówno BottomSheet i BottomSheetDialogFragment użyć BottomSheetBehavior, które można znaleźć w Bibliotece Wsparcia 23.X

To klasa Java ma 2 różnych zastosowań dla mMinOffset, jeden z nich jest używany do definiowania obszaru rodzic użyje go do narysowania swojej zawartości (być może NestedScrollView). A drugi, jeśli zdefiniujesz rozwinięty punkt kontrolny, to znaczy, jeśli wysuniesz go z STATE_COLLAPSED, ożywisz swój BottomSheet, aż dotrze do tego punktu zakotwiczenia, ALE jeśli nadal będziesz mógł przesuwać się do góry, aby pokryć całą wysokość rodziców (wysokość CoordiantorLayout) .

Jeśli przyjrzał BottomSheetDialog widać tą metodą:

private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) { 
    final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(), 
      android.support.design.R.layout.design_bottom_sheet_dialog, null); 
    if (layoutResId != 0 && view == null) { 
     view = getLayoutInflater().inflate(layoutResId, coordinator, false); 
    } 
    FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(android.support.design.R.id.design_bottom_sheet); 
    BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback); 
    if (params == null) { 
     bottomSheet.addView(view); 
    } else { 
     bottomSheet.addView(view, params); 
    } 
    // We treat the CoordinatorLayout as outside the dialog though it is technically inside 
    if (shouldWindowCloseOnTouchOutside()) { 
     final View finalView = view; 
     coordinator.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (isShowing() && 
         MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_UP && 
         !coordinator.isPointInChildBounds(finalView, 
           (int) event.getX(), (int) event.getY())) { 
        cancel(); 
        return true; 
       } 
       return false; 
      } 
     }); 
    } 
    return coordinator; 
} 



Nie mam pojęcia, który z tych 2 zachowań chcesz, ale jeśli trzeba drugi wykonaj te kroki :

  1. Utwórz klasę Java i przedłużyć go od CoordinatorLayout.Behavior<V>
  2. Skopiuj kod wklejania z domyślnego pliku BottomSheetBehavior do nowego.
  3. zmodyfikować metodę clampViewPositionVertical z następującego kodu:

    @Override public int clampViewPositionVertical (zobacz dziecko, int góra, int dy) { powrót ograniczeniem (góra, mMinOffset, mHideable mParentHeight: mMaxOffset); } int constrain (kwota int, int low, int high) { kwota zwrotu < niskie? niska: (ilość> wysoka?duża ilość); }

  4. Dodaj nowy stan

    public static final int STATE_ANCHOR_POINT = X;

  5. Modyfikacja kolejnych metod: onLayoutChild, onStopNestedScroll, BottomSheetBehavior<V> from(V view) i setState (opcjonalnie)

A oto jak jego wygląd jak:
[CustomBottomSheetBehavior]

4

znalazłem dużo prostsza odpowiedź; w przykładzie, gdzie uzyskać FrameLayout do dolnej blachy przy użyciu tego kodu

View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet); 

można ustawić wysokość na params układ dla tego widoku do wysokości cokolwiek chcesz ustawić wysokość do rozszerzonego.

bottomSheet.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT; 
3

wysokość jest zawinięty, ponieważ nadmuchanej widzenia jest dodawany do FrameLayout który ma layout_height=wrap_content. Zobacz FrameLayout (R.id.design_bottom_sheet) pod adresem https://github.com/dandar3/android-support-design/blob/master/res/layout/design_bottom_sheet_dialog.xml.

Poniższa klasa powoduje, że dolny arkusz jest pełny, a tło przezroczyste i całkowicie rozwinięte do góry.

public class FullScreenBottomSheetDialogFragment extends BottomSheetDialogFragment { 


    @CallSuper 
    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     ButterKnife.bind(this, view); 
    } 


    @Override 
    public void onStart() { 
     super.onStart(); 
     Dialog dialog = getDialog(); 

     if (dialog != null) { 
      View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet); 
      bottomSheet.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT; 
     } 
     View view = getView(); 
     view.post(() -> { 
      View parent = (View) view.getParent(); 
      CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) (parent).getLayoutParams(); 
      CoordinatorLayout.Behavior behavior = params.getBehavior(); 
      BottomSheetBehavior bottomSheetBehavior = (BottomSheetBehavior) behavior; 
      bottomSheetBehavior.setPeekHeight(view.getMeasuredHeight()); 

      parent.setBackgroundColor(Color.TRANSPARENT); 
     }); 
    } 

} 
Powiązane problemy