我有一个LoginActivity(用户登录).它基本上是它自己Activity的主题就像一个对话框(看起来像一个对话框).它出现在一个SherlockFragmentActivity.我想要的是:如果登录成功,应该有两个FragmentTransaction更新视图.这是代码:
在LoginActivity,如果成功登录,
setResult(1, new Intent());
Run Code Online (Sandbox Code Playgroud)
在SherlockFragmentActivity:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1) {
LoggedStatus = PrefActivity.getUserLoggedInStatus(this);
FragmentTransaction t = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
SherlockListFragment mFrag = new MasterFragment();
t.replace(R.id.menu_frame, mFrag);
t.commit();
// Set up Main Screen
FragmentTransaction t2 = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
SherlockListFragment mainFrag = new FeaturedFragment();
t2.replace(R.id.main_frag, mainFrag);
t2.commit();
}
}
Run Code Online (Sandbox Code Playgroud)
它在第一次提交时崩溃,使用此LogCat:
E/AndroidRuntime(32072): Caused by: java.lang.IllegalStateException: Can not perform this action …Run Code Online (Sandbox Code Playgroud) android android-intent android-activity android-fragmentactivity
我正在开发一个启动器应用程序,当用户验证自身时会显示对话框碎片.大部分时间这都运行良好,但有时我有这个错误日志:
02-07 18:55:56.619: E/AndroidRuntime(1300): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1280)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1291)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.app.BackStackRecord.commit(BackStackRecord.java:532)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.app.DialogFragment.dismissInternal(DialogFragment.java:292)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.app.DialogFragment.dismiss(DialogFragment.java:258)
02-07 18:55:56.619: E/AndroidRuntime(1300): at com.blablabla.android.app.fragments.login.LoginResultFragment$CloseDialogRunnable.run(LoginResultFragment.java:59)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.os.Handler.handleCallback(Handler.java:615)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.os.Handler.dispatchMessage(Handler.java:92)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.os.Looper.loop(Looper.java:137)
02-07 18:55:56.619: E/AndroidRuntime(1300): at android.app.ActivityThread.main(ActivityThread.java:4745)
02-07 18:55:56.619: E/AndroidRuntime(1300): at java.lang.reflect.Method.invokeNative(Native Method)
02-07 18:55:56.619: E/AndroidRuntime(1300): at java.lang.reflect.Method.invoke(Method.java:511)
02-07 18:55:56.619: …Run Code Online (Sandbox Code Playgroud) 我刚开始使用Android支持库中的DialogFragment,到目前为止发现它非常烦人.我有一些从我的应用程序中的不同位置调用的自定义AsyncTasks.有两种情况我遇到DialogFragments的问题:
至少我认为两者都是相当常见的情况,在这两种情况下我都得到了
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
Run Code Online (Sandbox Code Playgroud)
这就是我的AsyncTasks的结构:
private class UploadImageAsyncTask extends AsyncTask<Void, Void, Image> {
private ProgressDialogFragment dialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
FragmentManager fm = getSupportFragmentManager();
dialog = new ProgressDialogFragment();
dialog.show(fm, "ProgressDialogFragment");
}
@Override
protected Image doInBackground(Void... params) {
...
}
@Override
protected void onPostExecute(Image result) {
super.onPostExecute(result);
dialog.dismiss();
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以设置一个设置,防止屏幕在调试时进入睡眠状态,我可以在onActivityResult()中设置一个标志,然后在onStart()中打开对话框,但这不是我真正想要的.还有更好的解决方案吗?
谢谢西蒙
我已经覆盖了onSavedInstanceState并删除了super,我没有做任何事务,更不用说易失性函数或异步函数中的事务了.
我在自定义回调'onUserExistsListener'中调用它
@Override
public Boolean userExists(Boolean exists) {
if (exists) {
}
else
{
AlertDialogFragment Frag = AlertDialogFragment.newInstance(0, null);
Frag.show(getSupportFragmentManager(), "warndialog");
}
};
Run Code Online (Sandbox Code Playgroud)
尝试了其他SO问题中提出的所有内容,仍然没有找到解决办法?任何人?
码:
AlertDialogFragment Frag = AlertDialogFragment.newInstance(0, null);
Frag.show(getSupportFragmentManager(), "warndialog");
Run Code Online (Sandbox Code Playgroud)
过程:
OnCreate :( LoadNames函数)
LoadNames回调 - >显示对话框.
进一步:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
add_name_to_db();
}
Run Code Online (Sandbox Code Playgroud)
功能:
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 …Run Code Online (Sandbox Code Playgroud) android ×4