【问题标题】:Show toast prior to a for loop does not work在 for 循环之前显示 toast 不起作用
【发布时间】:2017-01-22 10:54:00
【问题描述】:

我试图在 for 循环之前显示一个 toast,但是,toast 没有显示。我也尝试添加一个小吃店,但这也不起作用。我想知道为什么吐司不先开火。我什至尝试了以下方法,但它一直在循环:

Toast toast = Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
while (!toast.getView().isShown()) {
    toast.show();
}

如何在 for 循环之前显示 toast?

ArrayList<String> pizzaBases = new ArrayList<> ();    

@Override
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            main.runOnUiThread(new Runnable() {
                public void run() {
                        Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
                        Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
                    }
            });

            SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);

            for (int i = 0; i < 100; i++) {
                try {
                    String pizza = preferences.getString("TypeOfBase" + i, "");
                    if (!pizza.equals("")) {
                        pizzaBases.add(pizza);
                    }
                } catch (NullPointerException e) {
                    //Do nothing here
                }
            }
        }
    });

    Button button1 = (Button) findViewById(R.id.buttonOne);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            for (String myString : pizzaBases) {
                System.out.println(myString);
            }
        }
    });
}

我尝试了诸如 runOnUiThread、asynctask 和 while 循环之类的解决方案,但它们都没有显示 toast 或snackbar。

编辑:

我发现 UI 仅在 for 循环完成后更新。我想知道为什么它会这样做,虽然它是先激活的。

【问题讨论】:

    标签: java android loops for-loop android-toast


    【解决方案1】:

    问题在于Toast.show() 是异步的。在当前方法返回之前,toast 不会显示,即使这样,Android 也可能会决定稍后显示它(例如,如果屏幕上已经显示了另一个 toast),甚至根本不显示。

    您真的需要使用原生吐司吗?也许最好的办法是使用另一个更可靠的系统。如果自定义视图出现在看起来像吐司的所有内容之上,并且您可以立即可靠地显示出来呢?

    【讨论】:

    • 我想告诉用户,当他单击按钮时,该函数已成功触发。这是必要的,因为用户必须等待,我想告诉他为什么。在这个例子中它是“Hello”,但在版本中它将是一个不同的消息。
    • 如果用户立即看到消息很重要,那么您不应该依赖 toast。我建议将它集成到您​​的 UI 中的某个位置,例如通过在 TextView 中显示消息或在用户单击按钮时更改按钮的文本(有些网站会这样做,他们禁用按钮并且文本更改为“Sending. ..”以及进度指示器)。但是如何实现它更多的是一个用户体验问题。你也可以使用像面包块这样的东西:play.google.com/store/apps/…
    • 我检查了,发现 UI 只在 for 循环之后更新,虽然它在 for 循环之前触发..
    • 知道为什么以及如何解决它吗?
    • 不幸的是,这就是 android 的工作方式。所有 UI 更新都在当前方法完成时完成(此处为 onCreate)。如果你想在 UI 更新后运行你的 for 循环,你应该使用 AysncTask。在 onPreExecute() 中放置更新 UI 的代码,在 doInBackground() 中运行 for 循环。
    【解决方案2】:

    你没有在这一行调用 show() 方法:

    Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
    

    应该是:

    Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
    

    【讨论】:

    • 我正在调用 .show(),我忘了用我提供的代码复制它
    【解决方案3】:

    您不需要使用 runOnUiThread,因为您已经在主线程上,并且您没有在第二个代码中的 toast 上调用 show()
    最好将最近的 Context 对象传递给您的 toast。

    public void onClick(View view) {
            Toast.makeText(YourActivity.this, "Hello", Toast.LENGTH_SHORT).show(); // show must be called
            Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
    
            SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
        ...
    }
    

    【讨论】:

    • 我正在调用 .show(),我忘了用我提供的代码复制它。我会调查的!
    • 在 getApplicationContext 之前我使用了 MainActivity.this,很遗憾它也不起作用。
    • @Jason 你确定你的onClick 被调用了吗?在那里放一个断点,检查它是否到达onClick方法。
    • 是的,它被称为,因为我看到了 for 循环的效果。如果我点击另一个按钮,我 System.out ArrayList,我可以清楚地看到内容。
    【解决方案4】:

    Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);

    • 当你显示敬酒时,你必须调用.show()方法。

    • 如果您在Activity 中显示Toast,最好使用Activitycontext

    更正

    Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();


    Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();

    如果您想显示SnackBar,则必须提供当前活动的视图而不是android.R.id.content

    更正

    Snackbar.make(findViewById(R.id.parent_of_your_activity), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();


    • 你不需要使用runOnUiThread,因为你已经在主线程上

    • 你可以得到Context

      1. 通过YourActivity.thisthisActivity 本身

      2. 通过getContext()Fragment 类中

    【讨论】:

    • 小吃店只是为了检查小吃店是否可以工作,但吐司不能。我正在调用 .show(),我在创建此问题时忘记将其复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2013-12-31
    • 2016-03-28
    • 2018-04-22
    • 2016-05-13
    • 2018-09-09
    相关资源
    最近更新 更多