Trate de entender el comportamiento de BottomSheet en la biblioteca de soporte de Android 23.2.1

Estoy tratando de implementar Hoja inferior en una de mis actividades y estoy un poco confundido por la forma en que se está comportando!

Así que aquí está el problema, tengo una actividad en la que estoy tratando de mostrar la hoja inferior y veo que:

  1. Si no establecemos la propiedad app:behavior_peekHeight , entonces la hoja Bottom nunca funciona

  2. Si usted fija el PeekHeight a algo menos que 30dp (básicamente apenas para ocultarlo de la pantalla)

  3. Si estableces app:behavior_peekHeight a más de 30dp en el archivo de diseño e intenta establecer el estado de bottomSheetBehavior en STATE_HIDDEN en tu método onCreate tu aplicación se bloquea con este error

causado por:

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference at android.support.design.widget.BottomSheetBehavior.setState(BottomSheetBehavior.jav a:440) at myapp.activity.SomeActivity.onCreate(SomeActivity.java:75) 

Estoy realmente confundido sobre por qué no me permite ocultarlo en onCreate? O por qué no podemos simplemente fijar el peekHeight a 0 para que no sea visible en la pantalla a menos que llame a la STATE_EXPANDED o incluso no la configuración que la propiedad debe predeterminado para ocultar! O por lo menos yo debería ser capaz de ponerlo como oculto en mi onCreate!

¿Me estoy perdiendo de algo? O es el comportamiento de la Hoja de Fondo rígido?

Mi archivo de diseño para la hoja de fondo es algo como esto:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:background="@android:color/white" android:layout_height="100dp" android:orientation="vertical" app:behavior_hideable="true" app:behavior_peekHeight="40dp" <!-- I cant set this less than 30dp just to hide--> app:layout_behavior="@string/bottom_sheet_behavior" tools:context="someActivity" android:id="@+id/addressbottomSheet" tools:showIn="@layout/some_activity"> 

En mi actividad estoy haciendo algo como esto:

 @InjectView(R.id.addressbottomSheet) View bottomSheetView; @Override protected void onCreate(Bundle savedInstanceState) { .... bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetView); // only if I have set peek_height to more than 30dp bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); } 

En mi onclick estoy haciendo esto:

 @Override public void onItemClick(View view, int position) { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); } 

Después de trabajar en este tema por unos días más encontré una solución alternativa para esto:

En lugar de usar Bottom_sheet directamente en su diseño, si creamos un fragmento Bottom_Sheet y luego lo instanciamos en la actividad este problema no ocurrirá y la hoja inferior se ocultará y no necesitamos especificar la peek_height

Aquí es lo que hice

 public class BottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_bottom_sheet, container, false); } 

Entonces en mi actividad

 bottomSheetDialog = BottomSheetDialog.newInstance(addressList.get(position), position); bottomSheetDialog.show(getSupportFragmentManager(), AddressActivity.class.getSimpleName()); 

Esto realmente resolvió mi problema de la hoja inferior que no se oculta cuando la actividad se inicia, pero todavía no soy capaz de entender por qué si bottom_sheet se incluye directamente nos enfrentamos a ese problema!

La razón de su caída se debe al hecho de que la referencia débil no se está estableciendo hasta que una de las últimas líneas en onLayoutChild, que le da su excepción ptr nulo.

Lo que puede hacer es crear un comportamiento personalizado de BottomSheet y anular onLayoutChild, estableciendo allí el estado expandido.

Un ejemplo se puede encontrar aquí: NullPointerExeption con AppCompat BottomSheets

(Refiriéndose a la pregunta) Suzzi bro el problema con su código es que está tratando de llamar al método setState directamente dentro de onCreate. Esto es lanzará un nullPointer porque la WeakReference no se inicializa todavía. Se inicializará cuando el diseño del Coordinador esté a punto de establecer su vista de niño.

OnLayoutChild (CoordinatorLayout padre, V hijo, int layoutDirection)

Se llama cuando el padre CoordinatorLayout es acerca de la disposición de la vista secundaria determinada.

Así que el mejor enfoque se establece la altura de ojeada a 0 y mostrar / ocultar dentro del oyente onItemClick. Aquí está mi código:

Bottom_sheet.xml

 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Bottom sheet" android:textColor="@android:color/black" /> </LinearLayout> 

Activity_main.xml

 <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show hide bottom sheet" /> <include android:id="@+id/gmail_bottom_sheet" layout="@layout/bottom_sheet" /> 

MainActivity.java

  public class MainActivity extends AppCompatActivity { boolean isExpanded; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CoordinatorLayout coordinatorLayout = (CoordinatorLayout) findViewById(R.id.gmail_coordinator); final View bottomSheet = coordinatorLayout.findViewById(R.id.gmail_bottom_sheet); final BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (isExpanded) { behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } else { behavior.setState(BottomSheetBehavior.STATE_EXPANDED); } isExpanded = !isExpanded; } }); } } 

Aquí inicialmente la hoja inferior no es visible. Al hacer clic en el botón, se establecerá el estado en STATE_COLLAPSED / STATE_EXPANDED.

El tutorial que seguí para hacer esta aplicación de demostración se muestra a continuación: Hoja inferior con Android Diseño de la Biblioteca de soporte

Para evitar la excepción de puntero nulo, establezca el estado en HIDDEN como esto en onCreate ()

 View bottomSheetView = findViewById(R.id.bottomsheet_review_detail_id); mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheetView); bottomSheetView.post(new Runnable() { @Override public void run() { mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); } }); 
  • Android: Problema de evento de toque de la hoja inferior anidado
  • Scrollview no se desplaza en la hoja de cálculo de Android
  • ¿Cómo manejar los problemas de la nueva hoja inferior de la biblioteca de soporte / diseño?
  • BottomSheetDialog / BottomSheetDialogFragment - ¿qué usar y cómo?
  • Pantalla inferior de pantalla completa con el botón Cerrar (X) en la parte superior
  • Hoja de fondo con movimiento Botones de acción flotante
  • Personalización de la hoja inferior persistente STATE_EXPANDED altura o desplazamiento
  • BottomSheet con ViewPager y fragmentos?
  • AS no puede encontrar BottomSheetBehavior_Params, _behavior_peekHeight y _behavior_hideable
  • ¿Cómo puedo agregar una sombra a la vista inferior de la hoja?
  • Cómo atenuar el fondo cuando se utiliza la parte inferior de la biblioteca de soporte?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.