android - modal - Cambiar dinĂ¡micamente la altura de BottomSheetBehavior
bottomsheetdialogfragment gradle (5)
Aunque el problema se resolvió en la biblioteca de soporte> = 24.0.0, si por alguna razón aún tiene que usar la versión anterior, aquí hay una solución.
mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull final View bottomSheet, int newState) {
bottomSheet.post(new Runnable() {
@Override
public void run() {
//workaround for the bottomsheet bug
bottomSheet.requestLayout();
bottomSheet.invalidate();
}
});
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
});
Estoy usando BottomSheetBehavior
de Google recientemente lanzado AppCompat v23.2. La altura de mi hoja inferior depende del contenido que se muestra dentro de la hoja inferior (similar a lo que hace Google en su aplicación de Mapas).
Funciona bien con los datos cargados inicialmente, pero mi aplicación cambia el contenido que se muestra durante el tiempo de ejecución y, cuando esto sucede, la hoja inferior se conserva en su altura anterior, lo que conduce a un espacio no utilizado en la parte inferior o un corte de la vista.
¿Hay alguna forma de informar al diseño de la hoja inferior para volver a calcular la altura utilizada para el estado expandido (cuando la altura del ViewGroup
de ViewGroup
se establece en MATCH_HEIGHT
) o alguna forma de establecer manualmente la altura requerida?
EDITAR: También intenté llamar manualmente a invalidate()
en ViewGroup
y al padre de este pero sin ningún éxito.
Estaba enfrentando el mismo problema cuando usé un recyclerview dentro de BottomSheet y los elementos cambiaron dinámicamente. Como @sosite ha mencionado en su comentario, el problema se ha registrado y se ha solucionado en la última versión. code.google.com/p/android/issues/detail?id=205226
Solo actualice su biblioteca de soporte de diseño a la versión 24.0.0 y verifique.
Me encontré con el mismo problema, cuando intentaba actualizar la altura de vista basada en su contenido, se encontró la altura de un diseño anterior. Esto tiene sentido ya que el nuevo diseño no había tenido lugar todavía. Al publicar en el subproceso de la interfaz de usuario, la altura del diseño se calcula después del nuevo diseño, y se realiza otra solicitud de diseño para actualizar la hoja inferior a la altura correcta.
void show() {
setVisibility(View.VISIBLE);
post(new Runnable() {
@Override
public void run() {
mBottomSheetBehavior.setPeekHeight(findViewById(R.id.sheetPeek).getHeight());
requestLayout();
}
})
}
Puede usar BottomSheetBehavior#setPeekHeight
para eso.
FrameLayout bottomSheet = (FrameLayout) findViewById(R.id.bottom_sheet);
BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setPeekHeight(newHeight);
Esto no mueve automáticamente la hoja inferior a la altura del peek. Puede llamar a BottomSheetBehavior#setState
para ajustar su hoja inferior a la nueva altura de peek.
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
Tuve el mismo problema con RelativeLayout
como mi hoja de resultados. La altura no será recalculada. Tuve que recurrir a establecer la altura mediante el nuevo valor recalculado y llamar a BottomSheetBehavior.onLayoutChild
.
Esta es mi solución temporal:
coordinatorLayout = (CoordinatorLayout)findViewById(R.id.coordinator_layout);
bottomSheet = findViewById(R.id.bottom_sheet);
int accountHeight = accountTextView.getHeight();
accountTextView.setVisibility(View.GONE);
bottomSheet.getLayoutParams().height = bottomSheet.getHeight() - accountHeight;
bottomSheet.requestLayout();
behavior.onLayoutChild(coordinatorLayout, bottomSheet, ViewCompat.LAYOUT_DIRECTION_LTR);