Versuchen Sie zu Verstehen, das Verhalten von BottomSheet im android-support-Bibliothek 23.2.1
Bin ich versucht zu implementieren Untere Blatt in einer meiner Tätigkeiten, und ich bin irgendwie verwirrt durch die Art und Weise verhält!
So, hier ist das problem, ich habe eine Tätigkeit, bei der ich versuche zu zeigen, Laken und ich sehe, dass:
-
wenn wir nicht setzen die
app:behavior_peekHeight
Eigenschaft dann das Untere Blatt nie funktioniert -
Wenn Sie die PeekHeight etwas weniger als 30dp (im Grunde nur zum ausblenden von Bildschirm)
- Wenn Sie
app:behavior_peekHeight
mehr als 30dp in der layout-Datei und versuchen Sie, den Zustand derbottomSheetBehavior
zuSTATE_HIDDEN
in Sie onCreate-Methode Ihrer app-Abstürze mit diesem Fehler
verursacht durch:
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)
Ich bin wirklich verwirrt, warum ist es nicht erlaubt mir, es zu verbergen, im onCreate? oder warum kann das setzen wir einfach die peekHeight 0, so dass es nicht auf dem Bildschirm sichtbar, es sei denn, wir nennen die STATE_EXPANDED
oder gar nicht-Einstellung, die Eigenschaft sollte standardmäßig zu verbergen! oder atleast ich sollte in der Lage sein, um es als versteckt in meinem onCreate!
bin ich etwas fehlt? oder ist das Verhalten der BottomSheet starr?
meine layout-Datei für die BottomSheet ist so etwas wie dieses:
<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">
in meiner Tätigkeit bin ich etwas wie dieses:
@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);
}
In meinem onclick-ich bin, dies zu tun:
@Override
public void onItemClick(View view, int position) {
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
- Haben Sie herauszufinden, der Grund für den ersten Fall: wenn wir nicht setzen die app:behavior_peekHeight Eigenschaft dann das Untere Blatt nie funktioniert? ich habe in der gleichen.
- diese Antwort könnte Ihnen helfen, stackoverflow.com/a/36236743/3000299
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem die Arbeit an diesem Thema für ein paar Tage fand ich eine Alternative Lösung für dieses:
Anstatt die Bottom_sheet direkt in Ihrem layout sind, wenn wir eine Bottom_Sheet-fragment und anschließend instanziert in der Aktivität dieses Problem wird nicht auftreten, und das untere Blatt ausgeblendet werden, und wir brauchen nicht, um anzugeben, die peek_height
hier ist, was ich Tat
Dann in meine Tätigkeit
Dies ist tatsächlich mein problem gelöst der unteren Platte wird nicht ausgeblendet, wenn die Aktivität beginnt, aber ich bin noch nicht in der Lage zu verstehen, warum, wenn bottom_sheet enthalten ist, direkt wir vor, dass problem!!!
(Auf die Frage) Suzzi bro das Problem mit Ihrem code, die Sie versuchen zu nennen, der setState-Methode direkt im onCreate. Dies wirft eine nullPointer, weil die WeakReference ist noch nicht initialisiert. Es wird initialisiert, wenn der Koordinator layout zu legen, Ihr Kind anzuzeigen.
Also der beste Ansatz ist, setzen Sie die peek-Höhe auf 0 und ein - /ausblenden innerhalb der onItemClick-listener.
Hier ist mein code:
bottom_sheet.xml
activity_main.xml
MainActivity.java
Hier zunächst das Unterste Blatt ist nicht sichtbar. Klick auf den button werden wir den Status auf STATE_COLLAPSED/STATE_EXPANDED.
Dem tutorial habe ich befolgt, um diese demo-app ist unten aufgeführt:
Spannbetttuch mit Android-Design-Support-Bibliothek
Der Grund sein Absturz ist aufgrund der Tatsache, dass der schwache Verweis ist nicht gesetzt, bis einer der letzten Zeilen in onLayoutChild, gibt Sie Ihr null-ptr-exception.
Was Sie tun können, ist, erstellen Sie eine benutzerdefinierte BottomSheet Verhalten und überschreiben onLayoutChild, Einstellung der erweiterten Staat.
Ein Beispiel finden Sie hier:
NullPointerExeption mit AppCompat BottomSheets
Zu vermeiden, die Null-Zeiger-Ausnahme, den Status auf VERSTECKT, wie dies in der onCreate()