31

sto cercando di mostrare snack vista quando clicco sul pulsante ma mostra forzare vicino errore quando cliccate sul pulsanteSnackbar non funziona nella classe frammento

devo definire classe frammento qui sotto e anche log degli errori.

ho lezione frammento:

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> 

Quando premo il bottone non sta mostrando snackbar. fornisce il seguente registro degli errori:

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) 

Come posso risolvere questo errore?

+0

Hai provato che passando 'V invece di 'getView' come primo parametro? –

+0

Che cos'è v? ho provato passando 'view' invece di' getView' ma non funziona. stesso errore. – deepak

+0

significa parametro di metodo 'onClick (View v)' –

risposta

22

ho risolto questo:

E va bene se non includiamo CoordinatedLayout alla mia fragment_home.xml

Soluzione:

0.123.

Definito: RelativeLayout privato mRoot;

Ora inizializzare in initUI(View view)

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

e su evento click del pulsante messo il seguente codice:

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

cosa Ora principale di questo è:

basta cambiare tema corrente a Theme.AppCompat.Light.NoActionBar

Fatto. !!!

+14

Se qualcun altro qui non mostra Snackbar, verifica di aver scritto il metodo '.show()' dopo di esso! È stupido, ma è stato il mio caso – Nexen

+0

@Nexen ti amo. E sì, è stupido ma è successo due volte al mese per me. – saiyancoder

+0

Questa soluzione non fa apparire il layout – Choletski

3

Bar in make metodo ha una visione e da questo punto di vista essa percorsi la gerarchia finché non trova un layout adatto per mostrare, se si ha un'eccezione questo significa che non hai aggiunto CoordinatedLayout al progetto

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

Quindi devo solo scrivere questo codice in corrente classe frammento? – deepak

+1

e cosa succede se non desidero aggiungere coordinatedLayout? – deepak

+0

no, questo è incorporato in SnackBar, probabilmente non stai aggiungendo qualcosa alle tue dipendenze – thepoosh

36

È anche possibile utilizzare:

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

come questo:

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

Vedi this

+1

Oh Man! hai salvato tutto il mio __Clan__ dalla distruzione _huge_, alla fine la tua risposta funziona –

+1

grazie mi ha aiutato a me – MinMaxUz

+0

@ojonugwaochalifu Sto usando un approccio simile. Ma mi dà errore. 'Impossibile risolvere il metodo getActivity()' Perché? – Omid1989

Problemi correlati