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関数を使用して作成)を使用して非表示にすることもできます。
ただし、それを実行できる機能はありません。
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()
クリックアクションを実装し、空にします。空のクリックアクションをクリックすると、スナックバーが閉じられます。
Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG)
.setAction("DISMISS", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
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
これは古い質問ですが、Snackbarの同様の機能に関する自分の経験を共有したいだけです。そのため、アプリのデザインを取得しました。スナックバーは無期限に表示され、ユーザーはそれを閉じることができるはずです。スナックバーは、タップするだけで閉じる必要がありました。
私たちのために働いている唯一の解決策は最後にありました(ここではretrolambdaを使用していますが、標準のView.OnClickListenerも使用できます):
final Snackbar snack = ... /* create proper snackbar as alway */
snack.getView().setOnClickListener(v -> snack.dismiss());
注getView()途中で呼び出します。
同じ問題がありました。 .dismiss()を使用すると、アニメーションが異なって見え、2つの問題がありました。
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
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による)