【问题标题】:Is it normal to show a single Toast multiple times on Android?在 Android 上多次显示单个 Toast 是否正常?
【发布时间】:2015-09-28 03:47:22
【问题描述】:

我正在使用Toast 向用户显示一些信息,因为我想立即显示最新消息而不管以前的消息,我这样做(从旧项目中学习):

public class MainActivity extends Activity {

    private Toast mToast;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
    }

    private void toast(final String message) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mToast.setText(message);
                mToast.show();
            }
        });
    }
}

也就是说,单个Toast 对象被重复使用并多次显示,每当我需要显示新消息时,我只需再次setTextshow 即可。看起来效果不错,但是在谷歌上搜索了一下,发现大部分人都会这样做:

    private void toast(final String message) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mToast.cancel();
                mToast = Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT);
                mToast.show();
            }
        });
    }

其中cancel 之前的Toast 然后由Toast.makeText 制作一个新的。

有什么不同吗?我应该更喜欢哪一个?

【问题讨论】:

  • 一般来说,在展示新的祝酒之前最好取消祝酒。原因是如果您在短时间内显示多个 toast,如果他们看到的 toast 与他们刚刚执行的操作无关,这可能会让用户感到困惑
  • 是的,但是这两种方法对用户来说是一样的。
  • 是的,但是如果您需要立即显示敬酒,最好取消敬酒。如果您使用的是 LENGTH_LONG 吐司,问题就更大了
  • 你应该更喜欢哪一个绝对只取决于你想要什么。你要不要把吐司堆起来?

标签: android android-toast


【解决方案1】:

您可以在 Activity 的变量中缓存当前的 Toast,然后在显示下一个 Toast 之前取消它。这是一个例子:

吐司 m_currentToast;

void showToast(String text)
{
    if(m_currentToast != null)
    {
        m_currentToast.cancel();
    }
    m_currentToast = Toast.makeText(this, text, Toast.LENGTH_LONG);
    m_currentToast.show();

}

另一种即时更新 Toast 消息的方法:

void showToast(String text)
{
    if(m_currentToast == null)
    {   
        m_currentToast = Toast.makeText(this, text, Toast.LENGTH_LONG);
    }

    m_currentToast.setText(text);
    m_currentToast.setDuration(Toast.LENGTH_LONG);
    m_currentToast.show();
}

参考:How to immediately replace the current toast with a second one without waiting for the current one to finish?

【讨论】:

    【解决方案2】:

    您应该尝试编写类似这样的代码以避免一次看到多个 toast。

     private void toast(final String message) {
     try{ mToast.getView().isShown();     // true if visible
            mToast.setText(message);
        } catch (Exception e) {         // invisible if exception
            mToast = Toast.makeText(theContext, message, toastDuration);
            }
        mToast.show();  //finally display it
    }
    

    代码帮助我是here

    【讨论】:

    • 抱歉,我确实看到了那篇帖子,但我想弄清楚潜在的差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多