为什么我的 Android 快餐栏在单击其操作按钮后消失了?
Why is my Android snackbar dismissed after clicking its action button?
我有一个我构建的小吃店,其持续时间设置为 Snackbar.LENGTH_INDEFINITE
当我调用 mySnackbar.show();
时,snackbar 正确显示
但是我一按下操作按钮,小吃栏就消失了。
dismiss方法好像是系统调用的
有人知道解决方法吗?
这是我构建小吃店的代码:
Snackbar mySnackbar = Snackbar.make(mParent, R.string.the_question, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.yes, new View.OnClickListener() {
@Override
public void onClick(View v) {
//My code...
}
})
.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
}
@Override
public void onShown(Snackbar snackbar) {
}
});
下面的代码显示了警报对话框 "after" 显示了快餐栏。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content),
"This is Snackbar", Snackbar.LENGTH_INDEFINITE).
setAction(R.string.yes, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
super.onDismissed(transientBottomBar, event);
}
@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
}
});
snackbar.show();
showAlertDialog(this, "Alert!!", "Alert Dialog", "Yes", "No");
}
showAlertDialog 是显示对话框的简单静态方法
public static void showAlertDialog(Context context, String title, String message, String posBtnMsg, String negBtnMsg) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton(posBtnMsg, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setNegativeButton(negBtnMsg, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
上面代码的输出屏幕截图如下,
这个问题的答案在于 Snackbar.setAction(CharSequence text, final View.OnClickListener listener)
的实现方式
如果您向此方法传递非空文本或非空侦听器,则显示操作文本的 TextView 会设置一个 OnClickListener,它会在执行操作时调用 BaseTransientBottomBar.dispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION)
。这会导致 Snackbar 被关闭。
为防止这种情况,需要检索 Snackbar 的操作视图的 TextView,并使用不调用 dispatchDismiss() 的侦听器覆盖其 OnClickListener
这里是Snackbar.setAction()
代码供参考
public Snackbar setAction(CharSequence text, final View.OnClickListener listener) {
final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);
final TextView tv = contentLayout.getActionView();
if (TextUtils.isEmpty(text) || listener == null) {
tv.setVisibility(View.GONE);
tv.setOnClickListener(null);
} else {
tv.setVisibility(View.VISIBLE);
tv.setText(text);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(view);
// Now dismiss the Snackbar
dispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION);
}
});
}
return this;
}
我有一个我构建的小吃店,其持续时间设置为 Snackbar.LENGTH_INDEFINITE
当我调用 mySnackbar.show();
但是我一按下操作按钮,小吃栏就消失了。
dismiss方法好像是系统调用的
有人知道解决方法吗?
这是我构建小吃店的代码:
Snackbar mySnackbar = Snackbar.make(mParent, R.string.the_question, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.yes, new View.OnClickListener() {
@Override
public void onClick(View v) {
//My code...
}
})
.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
}
@Override
public void onShown(Snackbar snackbar) {
}
});
下面的代码显示了警报对话框 "after" 显示了快餐栏。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content),
"This is Snackbar", Snackbar.LENGTH_INDEFINITE).
setAction(R.string.yes, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
super.onDismissed(transientBottomBar, event);
}
@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
}
});
snackbar.show();
showAlertDialog(this, "Alert!!", "Alert Dialog", "Yes", "No");
}
showAlertDialog 是显示对话框的简单静态方法
public static void showAlertDialog(Context context, String title, String message, String posBtnMsg, String negBtnMsg) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton(posBtnMsg, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setNegativeButton(negBtnMsg, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
上面代码的输出屏幕截图如下,
这个问题的答案在于 Snackbar.setAction(CharSequence text, final View.OnClickListener listener)
的实现方式
如果您向此方法传递非空文本或非空侦听器,则显示操作文本的 TextView 会设置一个 OnClickListener,它会在执行操作时调用 BaseTransientBottomBar.dispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION)
。这会导致 Snackbar 被关闭。
为防止这种情况,需要检索 Snackbar 的操作视图的 TextView,并使用不调用 dispatchDismiss() 的侦听器覆盖其 OnClickListener
这里是Snackbar.setAction()
代码供参考
public Snackbar setAction(CharSequence text, final View.OnClickListener listener) {
final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);
final TextView tv = contentLayout.getActionView();
if (TextUtils.isEmpty(text) || listener == null) {
tv.setVisibility(View.GONE);
tv.setOnClickListener(null);
} else {
tv.setVisibility(View.VISIBLE);
tv.setText(text);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(view);
// Now dismiss the Snackbar
dispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION);
}
});
}
return this;
}