31

Próbuję pokazać snackbar widok po kliknięciu na przycisku pokazuje jednak zmusić Zamknij Błąd po kliknięciu na przyciskSnackbar nie działa w obrębie klasy fragmentu

muszę zdefiniować klasę fragment poniżej, a także dziennik błędów.

Mam fragment Klasa:

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> 

Po naciśnięciu przycisku nie pokazuje snackbar. podaje poniżej protokół błędu:

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) 

Jak mogę rozwiązać ten błąd?

+0

Czy próbował przekazując 'v' zamiast' getView' jako pierwszy parametr? –

+0

Co to jest v? próbowałem, przekazując 'view' zamiast' getView', ale to nie działa. ten sam błąd. – deepak

+0

oznacza 'onClick (Zobacz v)' parametr metody –

Odpowiedz

22

mam rozwiązać ten:

to jest w porządku, jeśli nie zawierają CoordinatedLayout do mojego fragment_home.xml

Rozwiązanie:

Definicja: prywatny RelativeLayout mRoot;

teraz zainicjować w initUI(View view)

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

i kliknięcia przycisku imprezy umieścić następujący kod:

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

Teraz główną rzeczą jest to:

wystarczy zmienić aktualny motyw do Theme.AppCompat.Light.NoActionBar

Zrobione. !!!

+14

Jeśli ktoś tutaj nie pokazuje Snackbar, sprawdź czy napisałeś po nim metodę '.show()'! To głupie, ale tak było w moim przypadku. – Nexen

+0

@Nexen Kocham cię. I tak, to jest głupie, ale zdarzyło mi się dwa razy w miesiącu. – saiyancoder

+0

To rozwiązanie nie pojawia się na ekranie – Choletski

3

bistrem make metoda przyjmuje pogląd i z tego względu, że szlaki w górę heirarchy aż znajdzie odpowiedni układ, aby pokazać, jeśli miał wyjątek oznacza to, że nie dodano CoordinatedLayout do projektu

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; 
    } 
+0

Muszę tylko zapisać ten kod w bieżącym klasa fragmentów? – deepak

+1

i co jeśli nie chcę dodawać skoordynowanych wypłat? – deepak

+0

nie, to jest wbudowane w SnackBar, prawdopodobnie nie dodajesz czegoś do swoich zależności – thepoosh

36

Można również użyć:

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

tak:

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

Zobacz this

+1

Oh Man! uratowałeś mój cały __Clan__ przed ogromnym zniszczeniem, w końcu twoja odpowiedź zadziała –

+1

dzięki temu pomogła mi – MinMaxUz

+0

@ojonugwaochalifu Używam podobnego podejścia. Ale daje mi błąd. 'Nie można rozwiązać metody getActivity()' Dlaczego? – Omid1989

Powiązane problemy