我有一个Live Android应用程序,从市场我收到了以下堆栈跟踪,我不知道为什么它发生在应用程序代码中没有发生,但它是由应用程序中的一些或其他事件引起的(假设)
我没有使用Fragments,仍然有FragmentManager的引用.如果任何机构可以对某些隐藏的事实进行一些说明以避免此类问题:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyDown(Activity.java:1962)
at android.view.KeyEvent.dispatch(KeyEvent.java:2482)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1720)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1258)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2851)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2824)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2011)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud) 我的onActivityResult中有以下代码用于我的片段:
onActivityResult(int requestCode, int resultCode, Intent data){
//other code
ProgressFragment progFragment = new ProgressFragment();
progFragment.show(getActivity().getSupportFragmentManager(), PROG_DIALOG_TAG);
// other code
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
Run Code Online (Sandbox Code Playgroud)
有谁知道发生了什么,或者我如何解决这个问题?我应该注意到我正在使用Android支持包.
几年前,当我尝试FragmentTransaction在onActivityResult()回调中提交内容时,我在我的一个应用程序中遇到了问题.谷歌搜索,我发现这个问题和答案,说
在
onActivityResult()调用时,活动/片段的状态可能尚未恢复,因此在此期间发生的任何事务都将丢失.
我最终采用了相同答案推荐的解决方案来应用我的应用程序,生活很美好.然而,最近的实验表明,事情可能已经发生了变化,现在从内部投入可能是安全的.FragmentTransactiononActivityResult()
(支持v4)的文档FragmentManager.beginTransaction()将事务的安全窗口定义为:
注意:只能在活动保存其状态之前创建/提交片段事务.如果您尝试在之后
FragmentActivity.onSaveInstanceState()(以及之后FragmentActivity.onStart或之前)提交事务FragmentActivity.onResume(),您将收到错误.
阅读文档onActivityResult(),我明白了
您将在
onResume()重新启动活动之前立即收到此电话.
这使我相信执行这些事务应该是安全的onActivityResult(),就像onStart()已经被调用的那样,将我置于安全窗口内.
我做了一个应用程序来测试它,我成功地看到了我创建并提交的对话框片段onActivityResult().我有相同的应用程序也记录活动生命周期回调,所以我可以检查他们的订单onStart(),然后onRestoreInstanceState(),我看到,然后onActivityResult()每次.
我错过了什么吗?或者框架已更改,onActivityResult()现在保证是片段交易的安全位置?此行为是否因API级别而异?
我发现了另一个问题和答案似乎与我的文档相同,但两者都超过一年,并没有特别指的是onActivityResult()交易的安全场所.
android android-fragments android-activity android-fragmentactivity fragmentmanager
以前,我们没有问题显示以下内容 DialogFragment

// Triggered by button click.
private void openFromCloud() {
LoadFromCloudTaskFragment loadFromCloudTaskFragment = new LoadFromCloudTaskFragment();
FragmentManager fm = this.getSupportFragmentManager();
fm.beginTransaction().add(loadFromCloudTaskFragment, "loadFromCloudTaskFragment").commit();
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我们DialogFragment在按下下面的OK按钮后显示相同的内容Intent,则会发生错误.

private void openFromCloud() {
startActivityForResult(Utils.getGoogleAccountCredential().newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
switch (requestCode) {
case REQUEST_ACCOUNT_PICKER:
if (resultCode == RESULT_OK && data != null && data.getExtras() != null) {
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
if (accountName != null) {
Utils.getGoogleAccountCredential().setSelectedAccountName(accountName);
LoadFromCloudTaskFragment loadFromCloudTaskFragment = new …Run Code Online (Sandbox Code Playgroud) 我正在使用SD卡,所以试图在运行时获得许可.这是代码:
public class MainActivity extends AppCompatActivity implements FileListFragment.OnFragmentInteractionListener {
private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 111;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
...................
................
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
FileListFragment fileListFragment = FileListFragment.newInstance(0); // **Error line** …Run Code Online (Sandbox Code Playgroud) permissions android illegalstateexception onsaveinstancestate
我正在开发一个关于如何请求ACCESS_FINE_LOCATION权限的Android 6.0应用程序示例,如下图所示.
选择DENY选项时,我想向用户显示一个自定义对话框,但它会抛出以下异常:
IllegalStateException - Can not perform this action after onSaveInstanceState
调用方法时抛出的内容:
grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog");
Run Code Online (Sandbox Code Playgroud)
在onRequestPermissionsResult方法中
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == REQUEST_ACCESS_FINE_LOCATION){
if(grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "Location permission granted", Toast.LENGTH_LONG).show();
}else{
grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想这是因为对getSupportFragmentManager()方法的调用.这是我的GrantPermissionDialog代码.
public class GrantPermissionDialog extends DialogFragment {
private int statusCode;
private String message="El permiso de ubicación es necesario para que esta aplicación funcione.";
private String positiveButtonText="Salir";
private String …Run Code Online (Sandbox Code Playgroud)