我已经覆盖onSavedInstanceState并删除了super,我没有做任何事务,更不用说易失性函数或异步函数中的事务了。
我在自定义回调'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;
}
});
}
答案 0 :(得分:6)
通过致电Frag.show(getSupportFragmentManager(), "warndialog");
,您实际上正在执行片段交易(请参阅show())。
如果调用了activity的onSaveInstanceState()方法,则在尝试显示对话框时将抛出IllegalStateException。您需要更改代码以确保在显示对话框片段时,在活动状态恢复后(即onPostResume())执行此操作。有关详细信息,请参阅此blog post。
您还可以提交允许状态loss;
的交易答案 1 :(得分:0)
编辑:您需要在onCreate()中调用super.onCreate(SavedInstanceState)。没有它就行不通。
onSaveInstanceState()在活动结束时发生。停止并在那里展示UI已经太晚了。
您希望何时运行此代码?当按下后退按钮时可能?
将代码放入onBackPressed()中。
Android: Proper Way to use onBackPressed() with Toast
编辑如果您希望代码在活动开始时运行,就像您在其他评论中提到的那样。不要使用onSaveInstanceState()。 将您的代码放入onCreate()或onResume()。
答案 2 :(得分:-1)
根据回调的工作方式,您可能需要在UI线程上运行这些代码行,如下所示:
runOnUiThread(new Runnable() {
public void run() {
AlertDialogFragment Frag = AlertDialogFragment.newInstance(0, null);
Frag.show(getSupportFragmentManager(), "warndialog");
}
});