2016-04-05 9 views
9

Ostatnio użyłem android.support.design.widget.BottomSheetDialogFragment. Chciałem zrobić coś, co jest podobne do aplikacji kontaktowej Google, jej BottomSheet może nakładać się na pasek narzędzi i pasek stanu. Jednak kiedy używam BottomSheetDialogFragment do implementacji tego, okazuje się, że: My ImplementationWykonaj bottomSheetDialog pełny ekran nad paskiem stanu

Jak widać pasek narzędzi aktywności jest nadal widoczny. Oto mój kod BottomSheetDialogFragment:

public class KeyDetailFragment extends BottomSheetDialogFragment { 
    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() { 
     @Override 
     public void onStateChanged(@NonNull View bottomSheet, int newState) { 
      if (newState == BottomSheetBehavior.STATE_HIDDEN) { 
       dismiss(); 
      } 
     } 

     @Override 
     public void onSlide(@NonNull View bottomSheet, float slideOffset) { 

     } 
    }; 

    @Override 
    public void setupDialog(Dialog dialog, int style) { 
     super.setupDialog(dialog, style); 
     View contentView = View.inflate(getActivity(), R.layout.sheet_key, null); 
     dialog.setContentView(contentView); 
     View parent = (View) contentView.getParent(); 
     parent.setFitsSystemWindows(true); 
     BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(parent); 
     contentView.measure(0, 0); 
bottomSheetBehavior.setPeekHeight(contentView.getMeasuredHeight()); 

     CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) parent.getLayoutParams(); 
     if (params.getBehavior() instanceof BottomSheetBehavior) { 
       ((BottomSheetBehavior)params.getBehavior()).setBottomSheetCallback(mBottomSheetBehaviorCallback); 
     } 
     params.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; 
     parent.setLayoutParams(params); 
    } 
} 

odniosłem się do źródła i znalazłem atrybutem mnie interesuje:

private static int getThemeResId(Context context, int themeId) { 
    if (themeId == 0) { 
     // If the provided theme is 0, then retrieve the dialogTheme from our theme 
     TypedValue outValue = new TypedValue(); 
     if (context.getTheme().resolveAttribute(
       R.attr.bottomSheetDialogTheme, outValue, true)) { 
      themeId = outValue.resourceId; 
     } else { 
      // bottomSheetDialogTheme is not provided; we default to our light theme 
      themeId = R.style.Theme_Design_Light_BottomSheetDialog; 
     } 
    } 
    return themeId; 
} 

atrybut bottomSheetDialogTheme tutaj mogą zmienić styl prześcieradło, ale ja nie wiem, jak to zmienić, i wątpię, czy to by działało. Czy ktoś może mi dać rozwiązanie dotyczące osiągnięcia tego, że może on nakładać się na pasek narzędzi i pasek stanu?

+0

W tym samym numerze, znalazłeś jakieś rozwiązanie tego problemu? –

+0

@ nipun.birla Nie, jeszcze go nie znalazłem, chociaż minęło już około 3 miesięcy –

+0

Myślę, że powodem jest wzniesienie. Sprawdź to: http://stackoverflow.com/questions/35711808/android-bottomsheet-is-hinding-under-thebarbar. –

Odpowiedz

3

Nie mogłem znaleźć rozwiązania tego problemu, ale mogę zasugerować zastępcę, który pomógł mi służyć temu samemu celowi. Oto odniesienie: http://www.hidroh.com/2016/06/17/bottom-sheet-everything/

W artykule wyjaśniono tworzenie czynności na dole arkusza i dodawanie do niego cienia tła.

+0

Podane odniesienie jest z pewnością alternatywną drogą do mojego celu, dodanie cienia tła jest naprawdę trudne. –

11

Spróbuj tego. Mi to pasuje.

@Override 
public void setupDialog(Dialog dialog, int style) { 
    super.setupDialog(dialog, style); 
    View inflatedView = View.inflate(getContext(), R.layout.fragment_coupon, null); 
    dialog.setContentView(inflatedView); 


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

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

    View parent = (View) inflatedView.getParent(); 
    parent.setFitsSystemWindows(true); 
    BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(parent); 
    inflatedView.measure(0, 0); 
    DisplayMetrics displaymetrics = new DisplayMetrics();  getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int screenHeight = displaymetrics.heightPixels; 
    bottomSheetBehavior.setPeekHeight(screenHeight); 

    if (params.getBehavior() instanceof BottomSheetBehavior) { 
     ((BottomSheetBehavior)params.getBehavior()).setBottomSheetCallback(mBottomSheetBehaviorCallback); 
    } 

    params.height = screenHeight; 
    parent.setLayoutParams(params); 
} 
+2

działa dobrze, świetna robota! –

+0

Dziękujemy @LOG_TAG! :) – Vaigunth

+1

Jedną rzeczą, na którą należy zwrócić uwagę przy takim rozwiązaniu, jest displayMetrics.heightPixels, który będzie zawierał wysokość tacy powiadomień, więc spowoduje to nieznaczne odcięcie dna. Użyłem tego do obliczenia wysokości zasobnika powiadomień. 'private int getStatusBarHeight() { Prostokąt prostokątny = nowy prostokąt(); Okno Window = getActivity(). GetWindow(); window.getDecorView(). GetWindowVisibleDisplayFrame (prostokąt); return rectangle.top; } ' –

0

To był najłatwiejszy i pracował dla mnie, po prostu przedłużyć BottomSheetDialog i ustawić BottomSheetBehavior do BottomSheetBehavior.STATE_EXPANDED

Mała Hack jest układ android.support.design.R.id.design_bottom_sheet nazwa pochodzi od android wsparcia biblioteki projektowania

class BottomSheetDialogExpanded(context: Context) : BottomSheetDialog(context) { 

    private lateinit var mBehavior: BottomSheetBehavior<FrameLayout> 

    override fun setContentView(view: View) { 
     super.setContentView(view) 
     val bottomSheet = window.decorView.findViewById<View>(android.support.design.R.id.design_bottom_sheet) as FrameLayout 
     mBehavior = BottomSheetBehavior.from(bottomSheet) 
     mBehavior.state = BottomSheetBehavior.STATE_EXPANDED 
    } 

    override fun onStart() { 
     super.onStart() 
     mBehavior.state = BottomSheetBehavior.STATE_EXPANDED 
    } 
}