web-dev-qa-db-fra.com

Snackbar ne fonctionne pas dans la classe de fragment

J'essaie de montrer snackbar voir quand je clique sur le bouton mais il montre une erreur de fermeture de force lorsque je clique sur le bouton

J'ai définir la classe de fragment ci-dessous et aussi le journal des erreurs.

J'ai fragment de classe:

public class HomeFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_home, container, false);
        context = getActivity();
        initUI(rootView);
        return rootView;
    }

    private void initUI(View view) {

        btn= (Button) view.findViewById(R.id.btnpress);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Snackbar.make(getView(),"SnackBAr Test" , Snackbar.LENGTH_LONG).show();
            }
        });
    }

fragment_home.xml:

<RelativeLayout 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:id="@+id/mainrl"
    Android:layout_height="match_parent">

    <LinearLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:layout_centerHorizontal="true"
        Android:orientation="horizontal"
        Android:paddingBottom="40dp" >

            <Button
            Android:id="@+id/btn"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:Text="PLEASE PRESS" />

    </LinearLayout>

</RelativeLayout>

Quand j'appuie sur le bouton, il ne montre pas snackbar. il donne en dessous du journal des erreurs:

Java.lang.NoClassDefFoundError: Android.support.design.widget.CoordinatorLayout
            at Android.support.design.widget.Snackbar.findSuitableParent(Snackbar.Java:237)
            at Android.support.design.widget.Snackbar.make(Snackbar.Java:206)
            at com.example.test.fragment.HomeFragment$3.onLeftCardExit(HomeFragment.Java:168)
            at Android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationEnd(ViewPropertyAnimator.Java:1030)
            at Android.animation.ValueAnimator.endAnimation(ValueAnimator.Java:1056)
            at Android.animation.ValueAnimator.access$400(ValueAnimator.Java:50)
            at Android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.Java:644)
            at Android.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.Java:660)
            at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:788)
            at Android.view.Choreographer.doCallbacks(Choreographer.Java:591)
            at Android.view.Choreographer.doFrame(Choreographer.Java:559)
            at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:774)
            at Android.os.Handler.handleCallback(Handler.Java:808)
            at Android.os.Handler.dispatchMessage(Handler.Java:103)
            at Android.os.Looper.loop(Looper.Java:193)
            at Android.app.ActivityThread.main(ActivityThread.Java:5333)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:515)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:824)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:640)
            at dalvik.system.NativeStart.main(Native Method)

Comment puis-je résoudre cette erreur?

45
deepak

J'ai résolu ceci:

C'est bien si nous n'incluons pas CoordinatedLayout dans mon fragment_home.xml

Solution:

Défini: RelativeLayout privé mRoot;

Maintenant initialiser dans initUI(View view)

mRoot = (RelativeLayout) view.findViewById(R.id.mainrl);

et sur l'événement de clic de bouton mettez le code suivant:

 Snackbar.make(mRoot, "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();

Maintenant, l’essentiel à ce sujet est:

il suffit de changer le thème actuel en Theme.AppCompat.Light.NoActionBar

C'est fait.!!!

30
deepak

Vous pouvez aussi utiliser:

getActivity().findViewById(Android.R.id.content)

comme ça:

Snackbar snackBar = Snackbar.make(getActivity().findViewById(Android.R.id.content),
           "Look at me, I'm a fancy snackbar", Snackbar.LENGTH_LONG);
snackBar.show();

Voir this

71
ojonugwa ochalifu

La méthode SnackBar make prend une vue et à partir de cette vue, elle trace la hiérarchie jusqu'à ce qu'elle trouve une disposition appropriée à afficher. Si vous aviez une exception, cela signifie que vous n'avez pas ajouté CoordinatedLayout à votre projet.

private static ViewGroup findSuitableParent(View view) {
        ViewGroup fallback = null;

        do {
            if(view instanceof CoordinatorLayout) {
                return (ViewGroup)view;
            }

            if(view instanceof FrameLayout) {
                // Android.R.id.content
                if(view.getId() == 16908290) {
                    return (ViewGroup)view;
                }

                fallback = (ViewGroup)view;
            }

            if(view != null) {
                ViewParent parent = view.getParent();
                view = parent instanceof View?(View)parent:null;
            }
        } while(view != null);

        return fallback;
    }
5
thepoosh