web-dev-qa-db-ja.com

スナックバーはスワイプで閉じません

appcompatアクティビティにスナックバーがあります。スナックバーを閉じるボタンOKがあります。しかし、スワイプ(左から右)でスナックバーを閉じることはできません。

以下は、スナックバーの私のコードです。

final Snackbar snackbar = Snackbar
                                .make(view, "Error Message", Snackbar.LENGTH_INDEFINITE);

                        snackbar.setAction("OK", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                            snackbar.dismiss();
                                    }
                                });

                        snackbar.show();

編集1

アクティビティのXMLレイアウトの親レイアウトとして相対レイアウトがあります。

15
Intimate

Snackbarは、スワイプして閉じるなどのさまざまな操作を実行するために、ルートレイアウトまたはその上のどこかにCoordinatorLayoutを必要とします。レイアウト階層のどこかにそれを置く必要があります。

さらに、Snackbar.make()メソッドで渡すビューは、ビュー階層のどこかでCoordinatorLayoutを検索するために使用されます。このメソッドは、このビューからルートビューに移動して、スナックバーを表示し、アニメーションと操作を実行できるCoordinatorLayoutを見つけます。

ルートレイアウトをCoordinatorLayoutに置き換えると、問題が解決します。

28
Ashwani Kumar

CoordinatorLayoutを提供しなくても、スワイプして動作を閉じることをサポートするライブラリを作成しました。ユーザーは左または右の両方をスワイプして閉じることができます(最初は右にスワイプすることしかできません)。また、progressBarやその他のものも含まれています。試してみてください https://github.com/tingyik90/snackprogressbar

あなたがする必要があるのは、SnackProgressBarを作成し、スワイプで閉じることを許可することです。サンプルコード:

SnackProgressBar messageType = new SnackProgressBar( SnackProgressBar.TYPE_MESSAGE, "Your message") .setSwipeToDismiss(true)

4
tingyik90

Ashwani Kumar sの答えへの参照として。私は親密な LinearLayoutでこれを実装する方法があるかどうか尋ねられました。 match_parentおよびAndroid:layout_height属性にAndroid:layout_widthを指定したCoordinatorLayoutを使用して元のLinearLayoutを簡単にラップします。

これにより、元の配置が維持され、スナックバーがスワイプ可能であることを確認できます。

スナックバーは次のようになります。

フラグメントの場合-

Snackbar.make(getView(), "Error Message", Snackbar.LENGTH_INDEFINITE);

活動のために-

Snackbar.make(this.findViewById(Android.R.id.content), "Error Message",  Snackbar.LENGTH_INDEFINITE);

レイアウト全体をCoordinatorLayoutでラップし、これがルートレイアウトであると仮定します。

1
Nimig