【问题标题】:How to keep the snackbar open after action is called如何在调用操作后保持小吃店打开
【发布时间】:2016-09-10 20:45:51
【问题描述】:

我使用快餐栏来通知我的应用程序的用户他们没有连接到互联网。 我在小吃栏中添加了一个“重试”操作,用于重新检查连接。 我希望小吃栏一直显示,直到我自己关闭它(当找到互联网连接时),但我无法让它工作。每当我单击该操作时,快餐栏就会消失。

我已将持续时间设置为无限期,并且快餐栏确实会无限期地保持打开状态,但当我单击该操作时它会消失。

我在网上看到点击操作后自动关闭小吃栏并不总是默认行为。

编辑:

我觉得我的问题可能措辞不当。 我有一个带有动作的小吃栏,但我不希望在执行该动作时关闭小吃栏,它会自动执行 atm。

【问题讨论】:

  • 当用户点击“重试”时,为什么不创建一个新的snackbar?恕我直言,在将新的快餐栏显示为视觉反馈之前等待一秒钟甚至会很好,告诉用户“是的,我重试了,但仍然没有互联网连接”。 (这并不是说没有办法做你想做的事)
  • 那么你想在用户手动关闭它之前显示蛇条。对吗?
  • 嗯,用户可以通过滑动来关闭它,我对此没有问题。我只是不希望它在他们点击操作时自动关闭
  • 检查连接时已经有视觉反馈,但我想我最终会像你建议的那样使用新的小吃店。我只是无法想象为什么不关闭小吃店并不容易。就像我说的,这甚至曾经是默认行为。

标签: android dismiss snackbar


【解决方案1】:

您可以覆盖按钮的 OnClickListener 集。 首先用一些虚拟监听器制作小吃栏并设置动作

Snackbar snackbar = Snackbar.make(view,"TXT",Snackbar.LENGTH_LONG).setAction("OK", new View.OnClickListener() {
        @Override
        public void onClick(View v) { }
    });

然后找到按钮并设置你的listner

snackbar.show();
ViewGroup group = (ViewGroup) snackbar.getView();
for(int i=0; i< group.getChildCount();i++){
        View v = group.getChildAt(i);
        if(v instanceof Button){
            v.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    YOUR_ACTION();
                }
            });
        }
 }

【讨论】:

  • 添加到这个,而不是遍历 ViewGroup 你可以使用findViewById。即Button actionButton = (Button) snackbar.getView().findViewById(android.support.design.R.id.snackbar_action);
【解决方案2】:

你可以试试这个

final Snackbar snackbar = Snackbar.make("your view".getRootView(), "Annotations", Snackbar.LENGTH_INDEFINITE);
    snackbar.setAction("your action", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // do something
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    snackbar.show();
                }
            }, 1);
        }
    });
    snackbar.show();

点击动作后,snackbar 会自动关闭,但会有一些延迟,所以如果你直接在OnClickListener 中调用snackbar.show();,snackbar 将不会显示。因此,要使其始终显示,请在显示之前给它一些延迟。 (令人惊讶的是,一毫秒的延迟就足够了)

【讨论】:

    【解决方案3】:

    您可以执行以下操作:

    snack = Snackbar.make(binding.root, "Your text", Snackbar.LENGTH_INDEFINITE)
                .setAction("Button Text") {
                    // do something here 
                    it.postDelayed({
                        snack.show()
                    }, 1000) // Snackbar reappears after 1 second
                }
    

    【讨论】:

      猜你喜欢
      • 2019-09-14
      • 1970-01-01
      • 2020-05-18
      • 2016-09-05
      • 1970-01-01
      • 2020-07-25
      • 2016-03-13
      • 2018-05-13
      • 2022-10-08
      相关资源
      最近更新 更多