wake-up-neo.com

Die Snackbar funktioniert nicht innerhalb der Fragmentklasse

Ich versuche, Snackbar anzuzeigen, wenn ich auf die Schaltfläche klicke, aber es wird ein Fehler beim erzwungenen Schließen angezeigt, wenn ich auf die Schaltfläche klicke

Ich habe unten die Fragmentklasse und auch das Fehlerprotokoll definiert.

Ich habe Fragmentklasse:

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>

Wenn ich auf die Schaltfläche drücke, wird snackbar nicht angezeigt. Es gibt unten Fehlerprotokoll:

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)

Wie kann ich diesen Fehler beheben?

45
deepak

Ich habe das gelöst:

Es ist in Ordnung, wenn wir CoordinatedLayout nicht zu meinem fragment_home.xml Hinzufügen.

Lösung:

Definiert: private RelativeLayout mRoot;

Jetzt initialisiere in initUI(View view)

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

und auf Button click event geben Sie den folgenden Code ein:

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

Die Hauptsache dabei ist:

ändere einfach das aktuelle Thema in Theme.AppCompat.Light.NoActionBar

Es getan.!!!

30
deepak

Sie können auch verwenden:

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

so was:

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

Siehe this

71

Die SnackBar make -Methode nimmt eine Ansicht an und verfolgt von dieser Ansicht aus die Hierarchie, bis sie ein geeignetes Layout für die Anzeige findet. Wenn Sie eine Ausnahme hatten, bedeutet dies, dass Sie CoordinatedLayout nicht zu Ihrem Projekt hinzugefügt haben

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