web-dev-qa-db-fra.com

BottomSheetBehaviour: la vue n'est pas associée à BottomSheetBehavior

J'utilise Google Design Support Library 25.0.0 Dans mon activité, j'ai une disposition relative avec

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

Maintenant, quand je le référence pour ajouter BottomSheetBehaviour, j'obtiens l'erreur

Java.lang.IllegalArgumentException: The view is not associated with BottomSheetBehavior

Voici la mise en page:

<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:map="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/maps_colayout"
xmlns:app="http://schemas.Android.com/tools"
Android:fitsSystemWindows="true"
Android:background="@color/white">

...

<RelativeLayout
    Android:layout_width="match_parent"
    Android:layout_height="280dp"
    Android:layout_gravity="bottom"
    Android:id="@+id/rl_bottomsheet"
    Android:background="#F3F3F3"
    app:layout_behavior="Android.support.design.widget.BottomSheetBehavior">

    ...

</RelativeLayout>

Et voici le code correspondant à l'activité:

CoordinatorLayout colayout = (CoordinatorLayout) findViewById(R.id.maps_colayout);
    View bottomSheet = colayout.findViewById(R.id.rl_bottomsheet);
    BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
    behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            // React to state change
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
            // React to dragging events
        }
    });
25
Harish Vishwakarma

Vous devrez ajouter cette ligne dans votre balise de disposition linéaire. Celui qui est référencé.

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

ou pour Android x

app:layout_behavior="com.google.Android.material.bottomsheet.BottomSheetBehavior"
26
Leslie

L'espace de noms app est incorrect. Remplacer la ligne:

xmlns:app="http://schemas.Android.com/tools"

avec

xmlns:app="http://schemas.Android.com/apk/res-auto"

dans votre déclaration CoordinatorLayout dans le fichier de mise en page.

L'espace de noms tools est utilisé pour fournir des informations supplémentaires sur la mise en page aux "outils" (par exemple IDE). Ces informations sont supprimées de l'application.

D'un autre côté, l'espace de noms app est un espace de noms global pour tous les attributs personnalisés (c'est-à-dire non déclarés par les attributs Android system), déclarés par vous ou par les bibliothèques importées (la bibliothèque de support de conception est votre cas.) Ceux-ci sont inclus dans votre application.

Alors, à quoi sert réellement tools namespace? L'utilisation la plus courante est de mieux rendre l'aperçu de votre mise en page. Supposons par exemple que vous avez un TextView, qui devrait être initialement vide et rempli plus tard.

Vous pouvez ajouter un attribut à votre déclaration TextView:

tools:text="Some example text here"

Ce texte ne sera pas affiché dans votre application. Cependant, l'aperçu de la mise en page rendu dans votre Android Studio l'aura, afin que vous puissiez voir à quoi vous attendre sur votre appareil mobile.

11
Marcin Jedynak

Tout d'abord, si vous utilisez androidX, "app:layout_behavior="@string/bottom_sheet_behavior"" ou app:layout_behavior="com.google.Android.material.bottomsheet.BottomSheetBehavior"

Deuxièmement, la vue avec le comportement de la feuille de fond doit être un enfant direct de la disposition du coordinateur.

Enfin, supprimez layout_width et layout_height attribut de cet élément s'il l'est. Faites-le par programme, si nécessaire.

1
Max Droid