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?
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.!!!
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
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;
}