NullPointerExeption mit AppCompat BottomSheets

LinearLayout bottomSheetViewgroup = (LinearLayout) findViewById(R.id.bottomSheet); bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetViewgroup); bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); //this line 

Ich habe diesen Code in meiner Aktivität onCreate () -Methode und ich bekomme die unten NPE Ausnahme, wenn die letzte Zeile ausgeführt wird:

Verursacht durch: java.lang.NullPointerException: Versuch, die virtuelle Methode 'java.lang.Object java.lang.ref.WeakReference.get ()' auf eine Nullobjektreferenz auf android.support.design.widget.BottomSheetBehavior.setState ( BottomSheetBehavior.java:440)

  • Null Pointer Ausnahme starten IntentService
  • Java.lang.RuntimeException: Failure liefert Ergebnis ResultInfo bei der Protokollierung mit Facebook
  • Nach onLongPress, erste Ansicht in gridview bekommt NullPointerException in startDrag
  • Null-Zeiger Ausnahme bei Kind in onMeasure (): futuresimple / floating-action-button
  • NullPointerException beim Erstellen eines neuen Dialogs
  • NullPointerException in onLoaderFinished mit SimpleCursorAdapter
  • Box.COM-Integration mit einer Android-App-OAuthActivity-Nullpointerexception?
  • Dereferenz kann 'java.lang.NullPointerException' erzeugen
  • 4 Solutions collect form web for “NullPointerExeption mit AppCompat BottomSheets”

    Während die Antwort von Sanf0rds korrekt ist, erlaubt es nicht die Möglichkeit, das BottomSheet standardmäßig zu definieren. Das Problem wird verursacht durch die WeakReference nicht gesetzt, bis die letzte Zeile von onLayoutChild.

    Die Lösung besteht darin, unsere eigene Klasse zur Verfügung zu stellen, die das BottomSheetBehavior erweitert, aber den Zustand in einem übersteuerten onLayoutChild setzt. Der Code ist unten angegeben.

    Uk / ac / qub / quibe / misc / ExpandedBottomSheetBehavior.java

     package uk.ac.qub.quibe.misc; import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.util.AttributeSet; import android.view.View; /** * Created by mcp on 15/03/16. */ public class ExpandedBottomSheetBehavior<V extends View> extends android.support.design.widget.BottomSheetBehavior<V> { public ExpandedBottomSheetBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onLayoutChild(final CoordinatorLayout parent, final V child, final int layoutDirection) { SavedState dummySavedState = new SavedState(super.onSaveInstanceState(parent, child), STATE_EXPANDED); super.onRestoreInstanceState(parent, child, dummySavedState); return super.onLayoutChild(parent, child, layoutDirection); /* Unfortunately its not good enough to just call setState(STATE_EXPANDED); after super.onLayoutChild The reason is that an animation plays after calling setState. This can cause some graphical issues with other layouts Instead we need to use setInternalState, however this is a private method. The trick is to utilise onRestoreInstance to call setInternalState immediately and indirectly */ } } 

    In der Layout-Datei Referenz Referenz Ihr neues benutzerdefiniertes Verhalten.

    Veränderung

     app:layout_behavior="android.support.design.widget.BottomSheetBehavior" 

    Nach

     app:layout_behavior="uk.ac.qub.quibe.misc.ExpandedBottomSheetBehavior" 

    Ich habe eine Lösung gefunden, aber ich weiß immer noch nicht, warum das passiert. Die Lösung wird diese letzte Zeile direkt nach der Aktivität ausgeführt. Beispiel: in einem contextMenu-Callback oder in einem OnClickListener.

    Das Problem mit Ihrem Code ist, dass Sie versuchen, die setState-Methode direkt in onCreate aufzurufen. Dies wird ein nullPointer werfen, weil die WeakReference noch nicht initialisiert ist. Es wird initialisiert, wenn das Koordinator-Layout im Begriff ist, seine Kindersicht zu legen.

    OnLayoutChild (CoordinatorLayout Elternteil, V Kind, int layoutDirection)

    Aufgerufen, wenn der übergeordnete CoordinatorLayout über die Auslegung der gegebenen Kinderansicht ist.

    Also der beste Ansatz ist die peek Höhe auf 0 gesetzt und zeigen / verstecken innerhalb der onItemClick Hörer.

    Ich habe diese Frage hier beantwortet: https://stackoverflow.com/a/36236743/1314796

    Sie können auch überlegen, das globale Layout-Ereignis zu hören, auf diese Weise werden Sie sicher sein, dass das Bottomsheet wurde angelegt, wenn die Einstellung der zusammengebrochenen Zustand.

     final View bottomSheet = findViewById(R.id.bottom_sheet); bottomSheet.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { bottomSheet.getViewTreeObserver().removeOnGlobalLayoutListener(this); bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); bottomSheetBehavior.setPeekHeight(300); bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } }); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.