Snackbar在片段类中不起作用

问题描述 投票:43回答:3

当我点击按钮时,我试图显示小吃栏视图但是当我点击按钮时它显示强制关闭错误

我在下面定义了片段类,还有错误日志。

我有片段类:

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>

当我按下按钮时,它没有显示snackbar。它给出了以下错误日志:

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)

我怎样才能解决这个错误?

android android-fragments android-activity android-design-library android-snackbar
3个回答
71
投票

您还可以使用:

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

像这样:

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

this


30
投票

我解决了这个问题:

如果我们不将CoordinatedLayout包括在我的fragment_home.xml中,那就没问题了

解:

定义:私人RelativeLayout mRoot;

现在在initUI(View view)初始化

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

并在按钮单击事件上输入以下代码:

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

现在主要的是:

只需将当前主题更改为Theme.AppCompat.Light.NoActionBar

它做完了!!!


5
投票

SnackBar make方法获取视图,并从该视图中跟踪层次结构,直到找到合适的布局显示,如果您有异常,这意味着您没有将CoordinatedLayout添加到项目中

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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.