【问题标题】:Can not perform this action after onSaveInstanceState - DialogFragment在 onSaveInstanceState 之后无法执行此操作 - DialogFragment
【发布时间】:2014-01-22 23:08:38
【问题描述】:

我已经覆盖了 onSavedInstanceState 并删除了 super,我没有做任何事务,更不用说 volatile 函数或异步函数中的事务了。

我在自定义回调“onUserExistsListener”中调用它

        @Override
        public Boolean userExists(Boolean exists) {
            if (exists) {


            }
            else
            {
             AlertDialogFragment Frag = AlertDialogFragment.newInstance(0, null);
             Frag.show(getSupportFragmentManager(), "warndialog");
            }
   };

已尝试其他 SO 问题中建议的所有方法,但仍未找到解决方案?有人吗?

代码:

AlertDialogFragment Frag = AlertDialogFragment.newInstance(0, null);
 Frag.show(getSupportFragmentManager(), "warndialog");

过程:

OnCreate:(LoadNames 函数)

LoadNames 回调 -> 显示对话框。

进一步:

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

        add_name_to_db();
    }

功能:

public void add_name_to_db() {
        Details.checkNameExists(user_txt.getText().toString());
        Details.setOnUserExistsListener(new onUserExistsListener() {

            @Override
            public Boolean userExists(Boolean exists) {

                if (exists) 
                    {

                    } else {

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                AlertDialogFragment Frag = AlertDialogFragment.newInstance(0, null);
                                Frag.show(getSupportFragmentManager(), "warndialog");

                            }

                        });

                    }
                } else {
                    Toast.makeText(getApplicationContext(), "This is not a valid KIK username",
                            Toast.LENGTH_SHORT).show();
                }

                return exists;
            }

        });

    }

【问题讨论】:

  • 您能否再澄清一下您的问题?
  • 你不是在调用 super.onCreate() 吗?你必须这样做。
  • 问题不是很清楚,你应该显示你在哪里打电话onUserExistsListener。此外,您不需要覆盖onSavedInstanceState。也许这篇博文可以帮助你更好地理解为什么会出现这个异常以及如何避免它 -> androiddesignpatterns.com/2013/08/…
  • @rubenlop88 代码已添加!它一定与回调有关,我只是不知道为什么。
  • 您是否在日志中获得堆栈跟踪,是否崩溃?如果是这样,请修改您的问题... :)

标签: android android-fragments


【解决方案1】:

通过调用Frag.show(getSupportFragmentManager(), "warndialog");您实际上是在执行片段事务(参见show())。

如果活动的 onSaveInstanceState() 方法已被调用,当您尝试显示对话框时将抛出 IllegalStateException。您需要更改代码以确保当您显示对话框片段时,您会在活动状态恢复后执行此操作(即 onPostResume())。请参阅此blog post 了解更多信息。

你也可以提交事务允许状态loss

【讨论】:

  • 不幸的是,提交允许 stateloss 让我留下:java.lang.IllegalStateException: Activity 已被破坏
  • 如果 Activity 已被销毁,那么您无法将片段附加到它。要么更改为常规对话框,要么确保您在 Activity 处于活动状态且已恢复 Activity 状态时提交。
  • 我已经为 DialogFragment 做了一个替代解决方案,可以避免这个异常:github.com/AndroidDeveloperLB/DialogShard
【解决方案2】:

编辑:您需要在 onCreate() 中调用 super.onCreate(SavedInstanceState)。没有它就行不通。


onSaveInstanceState() 在活动完成时发生。现在停止并在那里显示 UI 为时已晚。

您希望此代码何时运行?当按下返回按钮时可能?

为此将您的代码放入 onBackPressed() 中。

Android: Proper Way to use onBackPressed() with Toast

编辑如果您希望代码在活动开始时运行,正如您在另一条评论中提到的那样。不要使用 onSaveInstanceState()。 将您的代码放入 onCreate() 或 onResume()。

【讨论】:

  • 我从来没有使用保存的实例状态,当活动离暂停或进入保存的实例的点还很远时,我试图在正常功能中显示一个对话框。跨度>
  • 你需要在onCreate()中调用super.onCreate(SavedInstanceState)。没有它就行不通。
  • 我已经这样做了。对不起,如果我让你有些困惑?现在大家再看看它,看看我是否可以用新鲜的头脑来阐明它。
【解决方案3】:

根据回调的工作方式,您可能需要在 UI 线程上运行这些代码行,如下所示:

runOnUiThread(new Runnable() {
    public void run() {
        AlertDialogFragment Frag = AlertDialogFragment.newInstance(0, null);
        Frag.show(getSupportFragmentManager(), "warndialog");

    }

});

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 2015-11-26
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2016-09-22
    • 2019-05-30
    相关资源
    最近更新 更多