31

I snackbar Ansicht zeigen versuche, wenn ich auf die Schaltfläche klicken, aber es zeigt, schließen Fehler erzwingen, wenn ich auf die Schaltfläche klickenSnackbar arbeitet nicht innerhalb Fragment Klasse

Ich habe unten Fragment Klasse definieren und auch Protokollfehler.

Ich habe Fragment Klasse:

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 den Knopf drücken, wird es nicht snackbar zeigt. es gibt unter 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?

+0

Haben Sie versucht, es durch 'v' statt' getView' als ersten Parameter übergeben? –

+0

Was ist v? Ich habe versucht, indem ich 'view' anstelle von' getView' übertrage, aber es funktioniert nicht. gleicher Fehler – deepak

+0

Mean 'onClick (View v)' Methode Parameter –

Antwort

22

ich habe dieses Problem gelöst:

Es ist in Ordnung, wenn wir meinen CoordinatedLayout-fragment_home.xml

nicht enthalten

Lösung:

Definiert: private RelativeLayout mRoot;

initialisieren Jetzt in initUI(View view)

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

und auf Button-Click-Ereignis den folgenden Code:

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

Nun Haupt daran ist:

gerade aktuellen Thema ändern Theme.AppCompat.Light.NoActionBar

Fertig. !!!

+14

Wenn jemand anderes hier nicht Snackbar zeigt, überprüfen Sie, dass Sie '.show()' Methode danach geschrieben haben! Es ist dumm, aber es war der Fall für mich – Nexen

+0

@Nexen Ich liebe dich. Und ja, es ist dumm, aber es ist mir zweimal in einem Monat passiert. – saiyancoder

+0

Diese Lösung erscheint nicht das Layout – Choletski

3

SnackBar make Methode nimmt einen Blick und aus dieser Sicht schleppt sie die Hierarchie nach oben, bis es ein geeignetes Layout, um zu zeigen, findet, wenn Sie eine Ausnahme haben dies bedeutet, dass Sie nicht CoordinatedLayout zu einem Projekt

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; 
    } 
hinzugefügt haben
+0

Also ich muss nur diesen Code in die aktuelle schreiben Fragmentklasse? – deepak

+1

und was ist, wenn ich koordiniertes Layout nicht hinzufügen möchte? – deepak

+0

Nein, das ist in SnackBar integriert, Sie fügen wahrscheinlich nichts zu Ihren Abhängigkeiten hinzu – thepoosh

36

Sie können auch verwenden:

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

wie folgt aus:

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

Siehe this

+1

Oh Mann! Du hast meinen ganzen __Clan__ aus _huge_ Zerstörung gerettet, am Ende funktioniert deine Antwort –

+1

Danke, dass es mir geholfen hat – MinMaxUz

+0

@ojonugwaochalifu Ich benutze einen ähnlichen Ansatz. Aber es gibt mir einen Fehler. 'Methode kann nicht aufgelöst werden getActivity()' Warum? – Omid1989