_com.Android.support:design:22.2.0
_ライブラリのSnackbarを使用しています。削除を取り消すために使用しています。生活を楽にするために、UIをデータソースから実際に削除されたように見せ、スナックバーの[元に戻す]ボタンが押されていない場合は、実際にデータソースから削除を実行します。したがって、スナックバーがいつ表示されなくなるかを知りたいので、アイテムを削除しても安全です。
SnackbarでgetView()を呼び出すことができますが、どのリスナーを使用する必要があるのかわかりません。 setOnSystemUiVisibilityChangeListener()
を試してみましたが、うまくいきませんでした。システムステータスバー専用です。
さらに、Snackbarにはプライベートコンストラクターがあるため、拡張できません。
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) {
...
}
});
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) {
...
}
});
最近、スクロールしてスナックバックを表示するときに、この問題に自分でつまずきました。最初のものが消える前にあまりにも多く表示されていました。アプリがスナックバーを配置すべきかどうかを知る方法を見つける必要がありました。
私は個人的にこの解決策を見つけました。
確かに、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を含むハンドラーは、あなたのケースにさえ適合しないかもしれないことに注意してください。すでに所有しているスニペットを使用することを提案した実装の一般的なアイデアを提供するだけでした。
スナックバーが表示または却下されたときに通知を受けるには、setCallback(Callback)を介してSnackbar.Callbackを提供できます。
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()
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();
setCallback
は非推奨になり、addCallback
を使用する必要があります
現在、スナックバーの表示が終了したときに通知を受け取る方法はありません。
このスレッドでは、スナックバー表示の期間のタイマーに基づいて回避策が説明されています。 サポートライブラリのスナックバーにOnDismissListener()?が含まれていません
この回避策で考慮すべき1つの問題は、スナックバーの期間が再開される可能性があることです。 Snackbarの材料設計仕様 は、無関係のダイアログまたはポップアップが表示された場合にこれが発生することを示しています。
現在、それを達成することはできません。
スナックバーが閉じられたときに呼び出されるリスナーはありません。
これを行う最も簡単な方法は、レコードを一時的に他の場所(ローカル変数を含む)に保存し、[元に戻す]ボタンが押された場合に再挿入することです。
snackbar.addCallback(new Snackbar.Callback() {
public void onShown(Snackbar snackbar) {
// on show
}
public void onDismissed(Snackbar snackbar, int event) {
// on dismiss
}
});