web-dev-qa-db-ja.com

スナックバーはフラグメントクラス内で機能していません

snackbarボタンをクリックすると表示されますが、ボタンをクリックすると強制終了エラーが表示されます。

以下にフラグメントクラスとエラーログを定義します。

フラグメントクラスがあります。

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)

このエラーを解決するにはどうすればよいですか?

45
deepak

私はこれを解決しました:

CoordinatedLayoutfragment_home.xmlに含めなくても問題ありません

解決:

定義済み:private 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に変更するだけです

できました。!!!

30
deepak

以下も使用できます。

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 を参照してください

71

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;
    }
5
thepoosh