首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的Android快餐栏在点击它的操作按钮后被取消了?

为什么我的Android快餐栏在点击它的操作按钮后被取消了?
EN

Stack Overflow用户
提问于 2019-02-16 00:14:21
回答 2查看 868关注 0票数 0

我有一个构建的快餐栏,它的持续时间设置为Snackbar.LENGTH_INDEFINITE

当我调用mySnackbar.show();时,快捷栏显示正常

但我一按下操作按钮,快餐店就被打发走了。

系统似乎调用了dismiss方法。

有谁知道解决办法吗?

下面是我用来构建我的快餐栏的代码:

代码语言:javascript
复制
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) {
                    }
               });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-22 23:12:37

这个问题的答案在于Snackbar.setAction(CharSequence text, final View.OnClickListener listener)的实现方式

如果将非空文本或非空侦听器传递给此方法,则会将显示操作文本的TextView设置为一个在执行操作时调用BaseTransientBottomBar.dispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION)的OnClickListener。这会导致Snackbar被取消。

为了防止出现这种情况,需要检索Snackbar的操作视图的TextView,并用不调用dispatchDismiss()的侦听器覆盖其OnClickListener。

下面是供参考的Snackbar.setAction()代码

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2019-02-19 22:13:13

下面的代码显示了“在快捷栏显示之后”的报警对话框。

代码语言:javascript
复制
 @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是显示对话框的简单静态方法

代码语言:javascript
复制
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();

    }

上述代码的输出屏幕截图如下所示:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54713144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档