2016-07-08 1 views
1

Мне нужно реализовать BottomSheetDialogFragment и столкнуться с проблемой. Мне нужно, чтобы мой BottomSheetDialogFragment имел фиксированную высоту. Кто-нибудь есть идея, как это сделать?Как я могу реализовать BottomSheetDialogFragment с фиксированной высотой

Вот мой XML содержания фрагмента

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/bottom_sheet_height" 
    android:background="@android:color/white" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/drag_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="24sp" 
     android:textColor="#FF0000" 
     android:text="Title"/> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:background="@android:color/white" 
     android:layout_weight="1"/> 

    <TextView 
     android:id="@+id/ok_button" 
     android:layout_width="match_parent" 
     android:layout_height="54dp" 
     android:background="@android:color/holo_blue_dark" 
     android:gravity="center" 
     android:text="Hello" 
     android:textColor="@android:color/white" 
     android:textSize="24sp"/> 

</LinearLayout> 

И в setupDialog() я это делаю:

@Override 
public void setupDialog(Dialog dialog, int style) { 
    super.setupDialog(dialog, style); 
    View contentView = View.inflate(getContext(), R.layout.bottom_sheet_dialog_content_view, null); 
    dialog.setContentView(contentView); 
    CoordinatorLayout.LayoutParams layoutParams = ((CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams()); 
    CoordinatorLayout.Behavior behavior = layoutParams.getBehavior(); 
    if (behavior != null && behavior instanceof BottomSheetBehavior) { 
     ((BottomSheetBehavior) behavior).setBottomSheetCallback(bottomSheetCallback); 
     ((BottomSheetBehavior) behavior).setPeekHeight(getResources().getDimensionPixelSize(R.dimen.bottom_sheet_height)); 
    } 

    initRecyclerView(contentView); 
} 

И поведение довольно часто:

private BottomSheetBehavior.BottomSheetCallback bottomSheetCallback = 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) { 
    } 
}; 

UPD: Решается путем установки фиксированной высоты на RecyclerView. Кто-нибудь знает лучший подход?

ответ

2

Вы можете напрямую задать высоту исправления, создав ее стиль.

в styles.xml

<style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog"> 
    <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item> 
</style> 

<style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal"> 
    <item name="behavior_peekHeight">500dp</item> 
</style> 

Update:

BottomSheetDialog dialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); 
dialog.setContentView(R.layout.layout_bottom_sheet); 
dialog.show(); 

Или второй Approch:

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

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

Как я могу использовать этот стиль? –

+0

@ Владислав Сазанович посмотри мое обновление. – Ironman

+0

Да, я вижу. Но, к сожалению, это не сработало для меня. Я думаю, что проблема в RecyclerView кажется, что она вынуждает изменять размер родительского макета, даже если он имеет фиксированную высоту. –

1

RecyclerView Если содержание заполнено внутри initRecyclerView(contentView);, то при показе BottomSheet это высота хорошо известна. Для того, чтобы установить высоту BottomSheet динамически и обернуть содержание затем добавить глобальный макет слушателя внутри onResume функции BottomSheetDialogFragment:

@Override 
public void onResume() { 
    super.onResume(); 
    addGlobaLayoutListener(getView()); 
} 

private void addGlobaLayoutListener(final View view) { 
    view.addOnLayoutChangeListener(new OnLayoutChangeListener() { 
     @Override 
     public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
      setPeekHeight(v.getMeasuredHeight()); 
      v.removeOnLayoutChangeListener(this); 
     } 
    }); 
} 

public void setPeekHeight(int peekHeight) { 
    BottomSheetBehavior behavior = getBottomSheetBehaviour(); 
    if (behavior == null) { 
     return; 
    } 
    behavior.setPeekHeight(peekHeight); 
} 

private BottomSheetBehavior getBottomSheetBehaviour() { 
    CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) ((View) getView().getParent()).getLayoutParams(); 
    CoordinatorLayout.Behavior behavior = layoutParams.getBehavior(); 
    if (behavior != null && behavior instanceof BottomSheetBehavior) { 
     ((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback); 
     return (BottomSheetBehavior) behavior; 
    } 
    return null; 
} 
+0

Мне действительно не нравится идея удаления OnLayoutChangeListener. Это может привести к будущим проблемам. –

+0

Используется только для получения реальной высоты BottomSheet во время инициализации. Затем он удаляется на свободные ресурсы. Если вы добавите его и не удалите его, каждый раз, когда отображается «BottomSheet», будет добавлен новый 'OnLayoutChangeListener'.Быстро у вас закончится нехватка ресурсов (памяти). –

+0

@ R.Zagórski любые способы полностью удалить перетаскивание BottomSheetDialogFragment ?? при использовании recyclerview ?? https://github.com/rubensousa/BottomSheetExample/issues/3 –

Смежные вопросы