web-dev-qa-db-ja.com

スナックバーが自分自身を却下したときに通知を受けるにはどうすればよいですか?

_com.Android.support:design:22.2.0_ライブラリのSnackbarを使用しています。削除を取り消すために使用しています。生活を楽にするために、UIをデータソースから実際に削除されたように見せ、スナックバーの[元に戻す]ボタンが押されていない場合は、実際にデータソースから削除を実行します。したがって、スナックバーがいつ表示されなくなるかを知りたいので、アイテムを削除しても安全です。

SnackbarでgetView()を呼び出すことができますが、どのリスナーを使用する必要があるのか​​わかりません。 setOnSystemUiVisibilityChangeListener()を試してみましたが、うまくいきませんでした。システムステータスバー専用です。

さらに、Snackbarにはプライベートコンストラクターがあるため、拡張できません。

63
Tyler Pfaff

Googleデザインライブラリは、バージョン23でSnackbarコールバックをサポートしています。 Snackbar docs および Callback docs を参照してください。その後、スナックバーが却下されたとき(および表示されたとき)に通知されます。これが役立つ場合は、却下のタイプも通知されます。

snackbar.addCallback(new Snackbar.Callback() {

    @Override
    public void onDismissed(Snackbar snackbar, int event) {
      //see Snackbar.Callback docs for event details
      ...  
    }

    @Override
    public void onShown(Snackbar snackbar) {
       ...
    }
  });
147
and_dev
    snackbar.setCallback(new Snackbar.Callback() {

        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
                // Snackbar closed on its own
            }
        }

        @Override
        public void onShown(Snackbar snackbar) {
            ...
        }
    });
28
Ananth

最近、スクロールしてスナックバックを表示するときに、この問題に自分でつまずきました。最初のものが消える前にあまりにも多く表示されていました。アプリがスナックバーを配置すべきかどうかを知る方法を見つける必要がありました。

私は個人的にこの解決策を見つけました。

確かに、Snackbar自体はその状態/可視性のリスナーを提供しませんが、SnackbarからViewオブジェクトを取得できます(getView();)。 Viewオブジェクトから、さまざまなメソッドを使用してリスナーを追加できます。

リスナーを追加するとvoidが返されるため、これを実装するには、一般的な「オールインワンライン」Toast/Snackbarの使用法から外す必要があります。

個人的には、ニーズを満たすためにOnAttachStateChangeListenerを見つけました。

それがあなたにとって役に立つかもしれない場合に備えて、私のコードでスニッパーを落としてください。

Snackbar snack = Snackbar.make(getView(), "My Placeholder Text", Snackbar.LENGTH_LONG);

snack.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
    @Override
        public void onViewAttachedToWindow(View v) {
            canDisplaySnackbar = false;
        }

    @Override
    public void onViewDetachedFromWindow(View v) {

        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            @Override
            public void run() {
                canDisplaySnackbar = true;

                }
        }, 1000);
    }
});
snack.show();

これは、私自身の問題に対する単なる実装であり、postDelayed Runnableを含むハンドラーは、あなたのケースにさえ適合しないかもしれないことに注意してください。すでに所有しているスニペットを使用することを提案した実装の一般的なアイデアを提供するだけでした。

15
FrancescoC

スナックバーが表示または却下されたときに通知を受けるには、setCallback(Callback)を介してSnackbar.Callbackを提供できます。

12
fab

KotlinのSnackbar.addCallback

val snackBar = Snackbar
                .make(view, "Text Snackbar", Snackbar.LENGTH_LONG)
                .addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
                    override fun onShown(transientBottomBar: Snackbar?) {
                        super.onShown(transientBottomBar)
                    }

                    override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
                        super.onDismissed(transientBottomBar, event)
                    }
                })

        val snackBarView = snackBar.view
        snackBarView.setBackgroundColor(Color.RED)
        snackBar.show()
7
Sergey Milakov

onDismissedは、アクションTextがその理由でクリックされたときにも呼び出されます。

event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT

そして今、新しいコードは以下のようになります。

final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG);

snackbar.addCallback(new Snackbar.Callback() {

@Override
public void onDismissed(Snackbar snackbar, int event) {
 if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
        // Snackbar closed on its own
    }  
}

@Override
public void onShown(Snackbar snackbar) {
...
}
});
snackBar.show();
5
Vishal G. Gohel
4
Tyler Pfaff

現在、スナックバーの表示が終了したときに通知を受け取る方法はありません。

このスレッドでは、スナックバー表示の期間のタイマーに基づいて回避策が説明されています。 サポートライブラリのスナックバーにOnDismissListener()?が含まれていません

この回避策で考慮すべき1つの問題は、スナックバーの期間が再開される可能性があることです。 Snackbarの材料設計仕様 は、無関係のダイアログまたはポップアップが表示された場合にこれが発生することを示しています。

3
BrentM

現在、それを達成することはできません。

スナックバーが閉じられたときに呼び出されるリスナーはありません。

これを行う最も簡単な方法は、レコードを一時的に他の場所(ローカル変数を含む)に保存し、[元に戻す]ボタンが押された場合に再挿入することです。

1
    snackbar.addCallback(new Snackbar.Callback() {
        public void onShown(Snackbar snackbar) {
           //  on show  
        }
 public void onDismissed(Snackbar snackbar, int event) {
          //  on dismiss  
        }
      });
0
dileep krishnan