Snackbar is not working within fragment class

59,522

Solution 1

You can also use:

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

like this:

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

See this

Solution 2

SnackBar make method takes a view and from that view it trails up the heirarchy until it finds a suitable layout to show, if you had an exception this means that you didn't add CoordinatedLayout to your project

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;
    }
Share:
59,522
Admin
Author by

Admin

Updated on July 08, 2022

Comments

  • Admin
    Admin almost 2 years

    I am trying to show snackbar view when I click on button but it shows force close error when I click on button

    I have define fragment class below and also error log.

    I have fragment class:

    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>
    

    When I press on button it is not showing snackbar. it gives below error log:

    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)
    

    How can I solved this error?