これは、リフレクションを必要としない、これを達成するためのややクリーンなソリューションです。これは、Snackbar 内のボタンのビュー ID を知っていることに基づいています。これはサポート ライブラリのバージョン 27.1.1 で動作しますが、ビュー ID が変更されると、将来のバージョンでは動作しなくなる可能性があります。
まず、空の OnClickListener を使用してスナックバー アクションを設定します。
snackbar.setAction("Save", new View.OnClickListener() {
@Override
public void onClick(View v) {}
});
その後、スナックバーにコールバックを追加します (表示する前に)。onShown 関数をオーバーライドし、使用しているボタンを見つけてR.id.snackbar_action
、独自の OnClickListener をそれに追加します。スナックバーは、手動で を呼び出したときsnackbar.dismiss()
、またはスナックバーが CoordinatorLayout にアタッチされている場合はスワイプによってのみ閉じられます (スワイプを無効にする方法は別の SO の質問です)。
snackbar.addCallback(new BaseTransientBottomBar.BaseCallback<Snackbar>() {
@Override
public void onShown(Snackbar transientBottomBar) {
super.onShown(transientBottomBar);
transientBottomBar.getView().findViewById(R.id.snackbar_action).setOnClickListener(new View.OnClickListener() {
// your code here
}