web-dev-qa-db-ja.com

独自のアクションボタンを使用してスナックバーを閉じる方法は?

AndroidデザインサポートライブラリにSnackbarのサポートが含まれるようになりました。

次のコードを使用して作成しました。

Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG)
        .setAction("Dismiss", new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        }).show();

スナックバーはスワイプで閉じることができます。ただし、独自のアクションボタン(setAction関数を使用して作成)を使用して非表示にすることもできます。

ただし、それを実行できる機能はありません。

76
Asim

Javaの場合

.makeメソッドは、Snackbarオブジェクトを返します。 finalにして、そのオブジェクトのインスタンスを保存します。次に、onClick().dismissを呼び出します。

final Snackbar snackBar = Snackbar.make(findViewById(Android.R.id.content), "Snackbar Message", Snackbar.LENGTH_LONG);

        snackBar.setAction("Action Message", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Call your action method here
                snackBar.dismiss();
            }
        });
        snackBar.show();

コトリンの場合

        Snackbar.make(
            findViewById(Android.R.id.content),
            "Snackbar Message",
            Snackbar.LENGTH_INDEFINITE
        ).setAction("Action Message") {
            // Call action functions here
        }.show()
128
EE66

クリックアクションを実装し、空にします。空のクリックアクションをクリックすると、スナックバーが閉じられます。

Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG)
    .setAction("DISMISS", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        }
    })
    .show();
48
Ali Zarei

Snackbar.LENGTH_LONGを使用する場合、2番目に自動的に閉じると、閉じるためのアクションボタンは必要ありません。このコードを使用する必要があります:

 Snackbar snackbar = Snackbar.make(relativeLayout, "Your Message", Snackbar.LENGTH_INDEFINITE);
            snackbar.setAction("dismiss", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    snackbar.dismiss();
                }
            });

            snackbar.show();

この行に注意してください

Snackbar.LENGTH_INDEFINITE
10
hamed golbahar

これは古い質問ですが、Snackbarの同様の機能に関する自分の経験を共有したいだけです。そのため、アプリのデザインを取得しました。スナックバーは無期限に表示され、ユーザーはそれを閉じることができるはずです。スナックバーは、タップするだけで閉じる必要がありました。

私たちのために働いている唯一の解決策は最後にありました(ここではretrolambdaを使用していますが、標準のView.OnClickListenerも使用できます):

final Snackbar snack = ... /* create proper snackbar as alway */
snack.getView().setOnClickListener(v -> snack.dismiss());

getView()途中で呼び出します。

5

同じ問題がありました。 .dismiss()を使用すると、アニメーションが異なって見え、2つの問題がありました。

  1. FABが再びダウンしない
  2. snackBar自体は、クリックの場合のように下にスライドしません

Snackbarの元のAndroidソースコードを調べると、次の解決策が見つかりました。

View snackbarView = snackbar.getView();
Button snackbarActionButton = (Button) snackbarView.findViewById(Android.support.design.R.id.snackbar_action);
//snackbarActionButton.setSoundEffectsEnabled(false); // might be considered in order not to have a confusing sound because nothing was clicked by the user

次に、snackBarActionButtonで.performClickを呼び出します

snackBarActionButton.performClick();

SnackbarのAndroidソースコードへのリンク: https://Android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/Android/support /design/widget/Snackbar.Java

2

Snackbar(from 'com.Android.support:design:23.2.1')は、多くの種類の却下アクションをサポートします。次の例のように、eventを使用して簡単なフィルターを作成できます。

Snackbar.make(view, wornMessage, Snackbar.LENGTH_LONG).setActionTextColor(context.getResources().getColor(R.color.primary))
    .setCallback(new Snackbar.Callback() {
        @Override
        public void onShown(Snackbar snackbar) {
            super.onShown(snackbar);
        // when snackbar is showing
        }

        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            super.onDismissed(snackbar, event);
            if (event != DISMISS_EVENT_ACTION) {
               //will be true if user not click on Action button (for example: manual dismiss, dismiss by swipe
            }
        }
    })
    .setAction("Undo, view1 -> {
        // if user click on Action button
}).show();

スナックバーの却下タイプ:

/** Indicates that the Snackbar was dismissed via a swipe.*/
public static final int DISMISS_EVENT_SWIPE = 0;
/** Indicates that the Snackbar was dismissed via an action click.*/
public static final int DISMISS_EVENT_ACTION = 1;
/** Indicates that the Snackbar was dismissed via a timeout.*/
public static final int DISMISS_EVENT_TIMEOUT = 2;
/** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/
public static final int DISMISS_EVENT_MANUAL = 3;
/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
public static final int DISMISS_EVENT_CONSECUTIVE = 4;

追伸サンプルコードで使用されるラムダ式(RetroLambdaによる)

1
a.black13