【问题标题】:Toast message disappears sooner than it shouldToast 消息消失得比应有的更快
【发布时间】:2018-12-18 22:09:30
【问题描述】:

为什么this GIF 中显示的 toast 消息会提前消失?我尝试在开始新活动(登录活动)之前显示来自第一个活动(密码重置活动)的 toast 消息。我还尝试在 onResume() 中显示来自新活动的 toast 消息,它具有相同的效果。此外,如 GIF 中所示,如果我点击它应该在的位置,则 toast 消息将重新出现,直到它真正完成。编辑:实际上,如果我点击屏幕上的任意位置,吐司消息会重新出现。

编辑:这是 toast 消息的代码:

auth.sendPasswordResetEmail(email)
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                Toast.makeText(ResetPasswordActivity.this, "We have sent you instructions to reset your password!", Toast.LENGTH_SHORT).show();
                                startActivity(new Intent(ResetPasswordActivity.this, LoginActivity.class));
                                finish();
                            } else {
                                Toast.makeText(ResetPasswordActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show();
                            }

                            progressBar.setVisibility(View.GONE);
                        }
                    });

我在使用 Toast.LENGTH_LONG 时遇到了同样的问题。它在与 Toast.LENGTH_SHORT 相同的时间内消失,但在我再次点击它以将其恢复后,它会持续更长的时间(如预期的那样),就像我在 GIF 中所做的那样。问题是,我不应该通过点击来让它显示完整的持续时间。

【问题讨论】:

  • 为吐司贴一些代码?
  • 这不是一个重复的问题,因为它询问如何使 Toast 消息持续时间超过 Toast.LENGTH_LONG。我只需要显示我的 Toast.LENGTH_SHORT 消息。我的问题导致 Toast.LENGTH_SHORT 和 Toast.LENGTH_LONG 过早消失。

标签: android toast


【解决方案1】:

您可以通过更改第三个参数轻松更改 Toast 的长度:

Toast.makeText(this, "Hello World", Toast.LENGTH_LONG).show();

或者

int duration;
Toast.makeText(this, "Hello World", duration).show();

【讨论】:

  • 我在使用 Toast.LENGTH_LONG 时遇到了同样的问题。它在与 Toast.LENGTH_SHORT 相同的时间内消失,但在我再次点击它以将其恢复后,它会持续更长的时间(如预期的那样),就像我在 GIF 中所做的那样。问题是,我不应该点击它来让它显示完整的持续时间。
  • 这就是我目前正在做的事情,“Toast.makeText(ResetPasswordActivity.this, “我们已经向您发送了重置密码的说明!”, Toast.LENGTH_SHORT).show();" ResetPasswordActivity 是第一个活动。
【解决方案2】:

您可以使用处理程序来延迟您的功能

new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            //do something 
        }
    }, 3000 ); //time in milisecond

编辑为您的代码

 auth.sendPasswordResetEmail(email)
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                Toast.makeText(ResetPasswordActivity.this, "We have sent you instructions to reset your password!", Toast.LENGTH_LONG).show();
                                new Handler().postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        startActivity(new Intent(ResetPasswordActivity.this, LoginActivity.class));
                                        finish();
                                    }
                                }, 3000 ); 

                            } else {
                                Toast.makeText(ResetPasswordActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show();
                            }

                            progressBar.setVisibility(View.GONE);
                        }
                    });

【讨论】:

  • 感谢您的提示,但我希望 Toast 消息在从重置密码活动切换到登录活动后显示在登录活动中。
  • @VincentNagel 尝试将您的 toast 编辑为“ Toast.makeText(getApplicationContext(), "我们已向您发送了重置密码的说明!", Toast.LENGTH_LONG) "
  • 谢谢,但这并没有解决问题。我决定只使用小吃吧。
【解决方案3】:

只要放 Toast.makeText(this, "Hello World", Toast.LENGTH_LONG).show();

如果它不起作用,则从设备上卸载应用程序并安装它

【讨论】:

  • 我把你说的放在登录活动的onResume中,它仍然在做同样的事情。重新安装应用程序没有帮助。我意识到如果我在一个活动中显示它并切换到另一个活动可能是正确的行为,因为文档说“它只填充了消息所需的空间量,并且当前活动保持可见和交互。”但是,我认为在 onResume 中调用时它不应该过早消失,因为那时用户可以与活动进行交互。
【解决方案4】:

尝试将 Toast 代码放在 finish() 之后,例如:

auth.sendPasswordResetEmail(email)
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                startActivity(new Intent(ResetPasswordActivity.this, LoginActivity.class));
                                finish();
                                Toast.makeText(ResetPasswordActivity.this, "We have sent you instructions to reset your password!", Toast.LENGTH_SHORT).show();
                            } else {
                                Toast.makeText(ResetPasswordActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show();
                            }

                            progressBar.setVisibility(View.GONE);
                        }
                    });

【讨论】:

  • 谢谢,但这并没有解决问题。我也尝试删除finish(),但效果不佳。
【解决方案5】:

您可以尝试启动 RestartPasswordActivity 以获得结果:

Intent intent = new Intent(this, Activity.class);
startActivityForResult(intent);

通过以下方式销毁此活动:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent); 
finish();

并以这种方式在 LoginActivity 中获取此值:

@Override protected void onActivityResult(int requestCode, 
int resultCode, Intent data) {
    if (requestCode == 1) { 
        if(resultCode == Activity.RESULT_OK){
            boolean result = data.getBooleanExtra("result"); 
            if(result)
                Toast.makeText(this, "Text", Toast.LENGTH_LONG).show();
        }
    }
}

【讨论】:

  • 谢谢,但这并没有最终解决它。我决定只使用小吃店。
【解决方案6】:
Toast.makeText(MainActivity.this, "Hello Word!", Toast.LENGTH_LONG).show();

【讨论】:

  • 用户表示使用LENGTH_LONG也有同样的效果。
猜你喜欢
  • 2021-10-06
  • 2011-11-28
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2014-07-08
  • 2012-07-03
相关资源
最近更新 更多