【问题标题】:Toasts never clear when I swap fragments当我交换片段时,祝酒词永远不会清除
【发布时间】:2013-06-01 00:24:29
【问题描述】:

在我的应用中切换 Fragment 之前,我会通过 Toast 向用户提供反馈。一旦 Toast 出现,它就永远不会清除。退出 Activity 或杀死整个事物是清除 Toast 的唯一方法。

我试图在提交 FragmentTransaction 后保留对 Toast 的引用并调用 cancel(),但是当我这样做时,Toast 根本不会出现。

我已添加日志记录,并确定 Toast 仅显示一次,而不是循环或重复显示。否则,该应用程序仍然可以响应,并且不会挂起。当我退出应用程序时,由于 onStop() 中的 cancel(),Toast 会被清除。

public final class MyActivity extends SherlockFragmentActivity {

    Toast toast = null;

    //...

    @Override
    protected void onStop () {
        if (toast != null) toast.cancel();
        toast = null;
        super.onStop();
    }

    //...

    private final class MyServiceReceiver extends ResultReceiver {

        public MyServiceReceiver(Handler handler) {
            super(handler);
        }

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            if (resultCode == MY_ERROR_CODE) {
                toast = Toast.makeText(getApplicationContext(), "my error message", Toast.LENGTH_SHORT);
                toast.show();

                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,
                            android.R.anim.fade_in, android.R.anim.fade_out);
                ft.replace(R.id.main_layout, new MyFragment());
                ft.commit();

                //if (toast != null) toast.cancel();
                //toast = null;
            }
        }

    }

}

【问题讨论】:

    标签: android android-fragments toast fragmenttransaction


    【解决方案1】:

    您将应用程序上下文传递给您的 Toast,toast 生命周期将与您的应用程序的上下文相关联。你应该传递你当前的活动。

    toast = Toast.makeText(this, "我的错误信息", Toast.LENGTH_SHORT);

    toast.show();

    【讨论】:

    • 我认为与应用程序上下文相关联是可取的吗?因为活动可能会在展示吐司后退出。 this 不是 Activity,因为此 Toast 显示在 ResultReceiver 类中。我试图将 ResultReciever 内容移动到另一个可以访问 this 的方法,但结果是一样的。 Toast 出现并且永远不会消失。
    • 我看到Toast在你的内部类MyServiceReceiver下,你不需要把你的代码移出来使用它,可以使用Toast.makeText(MyActivity.this, "my error message", Toast .LENGTH_SHORT).show()。更重要的是确保您的 toast 没有被多次调用。让我知道它是否适合您。
    • 谢谢,我还有一两件事要学习 Java。使用 Activity 上下文仍然不能解决问题。 ResultReceiver 是从 IntentService 调用的,因此在非 UI 线程上调用,I see now that the Toasts must be made from UI thread
    【解决方案2】:

    这里的问题是 IntentService 正在调用 ResultReceiver,因此 Toast 是在 UI 线程之外创建的。 See this post.

    为了解决这个问题,我为 Activity 创建了一个处理程序并在其中制作 Toast。作为奖励,我似乎不必管理对 Toast 的引用并清除 Activity.onStop。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      相关资源
      最近更新 更多