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:
- El desplazamiento no funciona con CoordinatorLayout + imagen de paralaje + BottomSheetLayout
- ListView en la hoja inferior
- RecyclerView (horizontal) anidados en BottomSheet que impide el desplazamiento vertical
- EditText setError está fuera de lugar en BottomSheetDialog
- BottomNavigationView no es de ancho completo
-
Si no establecemos la propiedad
app:behavior_peekHeight
, entonces la hoja Bottom nunca funciona -
Si usted fija el PeekHeight a algo menos que 30dp (básicamente apenas para ocultarlo de la pantalla)
- Si estableces
app:behavior_peekHeight
a más de 30dp en el archivo de diseño e intenta establecer el estado debottomSheetBehavior
enSTATE_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); }
- BottomSheetDialogFragment - Cómo configurar la altura expandida (o el desplazamiento de la parte superior del min)
- La Biblioteca de Soporte de Diseño de Android 24.2.1 hace que BottomSheet se abra al inicio
- Hoja de fondo de Android La altura de TextView no se ajusta al expandirse por primera vez
- Persistente hoja inferior con vista recicladora
- Persistente BottomSheet peekHeight y STATE_COLLAPSED no dibujar correctamente en Inicio de actividad
- Android BottomSheetDialogFragment no se expande por completo
- Hoja de fondo se aleja con cambio de visibilidad
- Hoja inferior de Android - tema de desplazamiento
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); } });
- Convertir RealmResults <E> a Lista <E> con copyFromRealm
- ¿Cómo puedo solucionar esta pérdida de memoria de Android que involucra Threads?