2016-07-08 27 views
1

Ich muss BottomSheetDialogFragment implementieren und Gesicht mit dem Problem. Ich brauche, dass meine BottomSheetDialogFragment feste Höhe hat. Hat jemand eine Idee, wie es geht?Wie kann ich BottomSheetDialogFragment mit fester Höhe implementieren

Hier ist mein xml von Fragment Inhalt

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

Und in der setupDialog() ich dies tue:

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

Und Verhalten ist durchaus üblich:

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: Gelöst, indem die feste Höhe auf RecyclerView eingestellt wird. Kennt jemand den besseren Ansatz?

Antwort

2

Sie können die Fixhöhe direkt angeben, indem Sie Style erstellen.

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

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

Wie kann ich diese Stile verwenden? –

+0

@VladislavSazanovich sehe mein Update. – Ironman

+0

Ja, ich verstehe. Aber leider hat es bei mir nicht funktioniert. Ich denke, das Problem ist in der RecyclerView es scheint wie es zwingen, Elternlayout zu ändern, auch wenn es feste Höhe hat –

1

Wenn der RecyclerView Inhalt innerhalb 01 gefüllt istdann, wenn BottomSheet angezeigt wird, ist seine Höhe bekannt. So stellen Sie die Höhe der BottomSheet dynamisch und den Inhalt wickeln dann global Layout hinzufügen Zuhörer innerhalb onResume Funktion des 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

Ich mag wirklich nicht die Idee, OnLayoutChangeListener zu entfernen. Dies kann zu zukünftigen Problemen führen. –

+0

Es wird nur verwendet, um während der Initialisierung die tatsächliche Höhe von BottomSheet einmal zu erhalten. Dann wird es entfernt, um Ressourcen freizugeben. Wenn Sie es hinzufügen würden und es nicht entfernen würden, würde jedes Mal, wenn "BottomSheet" angezeigt wird, ein neuer "OnLayoutChangeListener" angehängt worden sein.Schnell würden Ihnen die Ressourcen (Speicher) ausgehen. –

+0

@ R.Zagórski irgendwelche Möglichkeiten, um ziehen von BottomSheetDialogFragment ?? bei der Verwendung von Recyclerview ?? https://github.com/rubensousa/BottomSheetExample/issues/3 –