java.lang.IllegalStateException:不能的onSaveInstanceState后与DialogFragment执行此操作 [英] java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState with DialogFragment

查看:223
本文介绍了java.lang.IllegalStateException:不能的onSaveInstanceState后与DialogFragment执行此操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在面临的问题与DialogFragment / getSupportFragmentManager / Android版本4.x版

  01-10 19:46:48.228:E / AndroidRuntime(9879):java.lang.IllegalStateException:不能后的onSaveInstanceState执行此操作
01-10 19:46:48.228:E / AndroidRuntime(9879):在android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314)
01-10 19:46:48.228:E / AndroidRuntime(9879):在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1325)
01-10 19:46:48.228:E / AndroidRuntime(9879):在android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
01-10 19:46:48.228:E / AndroidRuntime(9879):在android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532)
01-10 19:46:48.228:E / AndroidRuntime(9879):在android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
01-10 19:46:48.228:E / AndroidRuntime(9879):在com.v1.mypck.TermsAndConditions.showDialog(TermsAndConditions.java:256)
01-10 19:46:48.228:E / AndroidRuntime(9879):在com.v1.mypck.TermsAndConditions.handleMessage(TermsAndConditions.java:62)
01-10 19:46:48.228:E / AndroidRuntime(9879):在com.v1.mypck.TermsAndConditions $ IncomingHandler.handleMessage(TermsAndConditions.java:53)
01-10 19:46:48.228:E / AndroidRuntime(9879):在android.os.Handler.dispatchMessage(Handler.java:99)
01-10 19:46:48.228:E / AndroidRuntime(9879):在android.os.Looper.loop(Looper.java:137)
01-10 19:46:48.228:E / AndroidRuntime(9879):在android.app.ActivityThread.main(ActivityThread.java:4441)
01-10 19:46:48.228:E / AndroidRuntime(9879):在java.lang.reflect.Method.invokeNative(本机方法)
01-10 19:46:48.228:E / AndroidRuntime(9879):在java.lang.reflect.Method.invoke(Method.java:511)
01-10 19:46:48.228:E / AndroidRuntime(9879):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
01-10 19:46:48.228:E / AndroidRuntime(9879):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-10 19:46:48.228:E / AndroidRuntime(9879):在dalvik.system.NativeStart.main(本机方法)
 

在低于code,当我preSS回到它试图完成当前活动并回到previous活动,它抛出上述错误。

code运作良好的旧版本(到4.x之前)。

有人可以指导我在正确的方向。

 公共类TermsAndConditions扩展SherlockFragmentActivity实现LoaderManager.LoaderCallbacks<的JSONObject> {
    static final的字符串变量=TermsAndConditions;
    私有静态诠释titleResource;
    私有静态诠释的MessageResource;

    私人IncomingHandler处理器= NULL;
    私有静态最终诠释SHOW_NETWORK_DIALOG = 3;

    静态类IncomingHandler扩展处理程序{
        私人最终的WeakReference< TermsAndConditions> mTarget;

        IncomingHandler(TermsAndConditions目标){
            mTarget =新的WeakReference< TermsAndConditions>(目标);
        }

        @覆盖
        公共无效的handleMessage(信息MSG){
            TermsAndConditions目标= mTarget.get();
            如果(目标!= NULL){
                target.handleMessage(MSG);
            }
        }
    }
    公共无效的handleMessage(信息MSG){
        开关(msg.what){
            案例SHOW_NETWORK_DIALOG:
                titleResource = R.string.msg_alert_no_network_title;
                的MessageResource = R.string.msg_alert_no_network_message;
                的ShowDialog();
                打破;
        }
    }
    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.web_view);

        getSupportActionBar()setDisplayHomeAsUpEnabled(真)。
        getSupportLoaderManager()initLoader(0,空,这一点)。
    }
    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        开关(item.getItemId()){
            案例android.R.id.home:
                完();
                返回true;
            默认:
                返回super.onOptionsItemSelected(项目);
        }
    }
    私人无效loadViewData(){
        //逻辑来加载内容。
    }

    @覆盖
    公共装载机<的JSONObject> onCreateLoader(INT为arg0,捆绑ARG1){
        如果(句柄== NULL){
            处理器=新IncomingHandler(TermsAndConditions.this);
        }
        返回新JsonLoader(本);
    }

    @覆盖
    公共无效onLoadFinished(装载机<的JSONObject>为arg0,JSONObject的jsonData){
        如果(jsonDataObject == NULL || jsonDataObject.length()== 0){
            handler.sendEmptyMessage(SHOW_NETWORK_DIALOG);
        } 其他 {
            loadViewData();
        }
    }

    @覆盖
    公共无效onLoaderReset(装载机<的JSONObject>为arg0){
        如果(jsonDataObject == NULL || jsonDataObject.length()== 0){
            handler.sendEmptyMessage(SHOW_NETWORK_DIALOG);
        } 其他 {
            loadViewData();
        }
    }

    公共静态类JsonLoader扩展AsyncTaskLoader<的JSONObject> {
        公共JsonLoader(上下文的背景下){
            超(上下文);
        }

        @覆盖
        保护无效onStartLoading(){
            如果(jsonDataObject!= NULL){
                deliverResult(jsonDataObject);
            }
            如果(takeContentChanged()|| jsonDataObject == NULL){
                的forceload();
            }
        }

        @覆盖
        公众的JSONObject loadInBackground(){
            尝试 {
                返回response.getJSONObject(结果);
            }赶上(JSONException E){
                返回null;
            }赶上(的Throwable E){
                返回null;
            }
        }

        @覆盖
        公共无效deliverResult(JSONObject的newJsonData){
            如果(isReset()){
                如果(jsonDataObject!= NULL){
                    onReleaseResources(jsonDataObject);
                }
            }
            JSONObject的OLDDATA = jsonDataObject;
            jsonDataObject = newJsonData;
            如果(isStarted()){
                super.deliverResult(jsonDataObject);
            }
            如果(OLDDATA!= NULL){
                onReleaseResources(OLDDATA);
            }
        }

        @覆盖
        保护无效onStopLoading(){
            cancelLoad();
        }

        @覆盖公共无效onCanceled(JSONObject的jsonData){
            super.onCanceled(jsonData);
            onReleaseResources(jsonData);
        }

        @覆盖保护无效onReset(){
            super.onReset();
            onStopLoading();
            如果(jsonDataObject!= NULL){
                onReleaseResources(jsonDataObject);
                jsonDataObject = NULL;
            }
        }

        保护无效onReleaseResources(JSONObject的jsonData){
            jsonData = NULL;
        }
    }
    公共静态类MyAlertDialogFragment扩展DialogFragment {
        公共静态MyAlertDialogFragment的newInstance(INT标题){
            MyAlertDialogFragment FRAG =新MyAlertDialogFragment();
            捆绑的args =新包();
            args.putInt(题,题);
            frag.setArguments(参数);
            返回FRAG;
        }

        @覆盖
        公共对话onCreateDialog(包savedInstanceState){
            。INT TITLE = getArguments()调用getInt(标题);
            返回新AlertDialog.Builder(getActivity())
                    .setTitle(标题)
                    .setMessage(的MessageResource)
                    .setPositiveButton(R.string.alert_dialog_ok,
                        新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话,诠释whichButton){

                            }
                        }
                    )
                    。创建();
        }
    }
    公共无效的ShowDialog(){
        DialogFragment newFragment = MyAlertDialogFragment.newInstance(titleResource);
        newFragment.show(getSupportFragmentManager(),my_dialog);
    }
}
 

解决方案

下面是另一个线程的回答:

<一个href="http://stackoverflow.com/questions/12105064/actions-in-onactivityresult-and-error-can-not-perform-this-action-after-onsavei">Actions在onActivityResult和&QUOT;的onSaveInstanceState&QUOT后错误无法执行此操作;

也在这里:

<一个href="http://stackoverflow.com/questions/6628215/refreshing-my-fragment-not-working-like-i-thought-it-should">Refreshing我的片段不工作像我认为应该

这是一个示例解决这个问题:

  DialogFragment loadingDialog CreateDialog函数=();

FragmentTransaction交易= getSupportFragmentManager()的BeginTransaction()。
                    transaction.add(loadingDialog,加载);
                    transaction.commitAllowingStateLoss();
 

I am facing issue with DialogFragment / getSupportFragmentManager / Android version 4.x

01-10 19:46:48.228: E/AndroidRuntime(9879): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
01-10 19:46:48.228: E/AndroidRuntime(9879):     at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1325)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at com.v1.mypck.TermsAndConditions.showDialog(TermsAndConditions.java:256)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at com.v1.mypck.TermsAndConditions.handleMessage(TermsAndConditions.java:62)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at com.v1.mypck.TermsAndConditions$IncomingHandler.handleMessage(TermsAndConditions.java:53)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at android.os.Looper.loop(Looper.java:137)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at android.app.ActivityThread.main(ActivityThread.java:4441)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at java.lang.reflect.Method.invokeNative(Native Method)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at java.lang.reflect.Method.invoke(Method.java:511)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-10 19:46:48.228: E/AndroidRuntime(9879):     at dalvik.system.NativeStart.main(Native Method)

In below code when i press back it tries to finish current activity and go back to previous activity it throws above error.

Code works well on older version (prior to 4.x).

Can somebody guide me in right direction.

public class TermsAndConditions extends SherlockFragmentActivity implements LoaderManager.LoaderCallbacks<JSONObject>{
    static final String TAG = "TermsAndConditions";
    private static int titleResource;
    private static int messageResource;

    private IncomingHandler handler = null;
    private static final int SHOW_NETWORK_DIALOG = 3;

    static class IncomingHandler extends Handler {
        private final WeakReference<TermsAndConditions> mTarget; 

        IncomingHandler(TermsAndConditions target) {
            mTarget = new WeakReference<TermsAndConditions>(target);
        }

        @Override
        public void handleMessage(Message msg) {
            TermsAndConditions target = mTarget.get();
            if (target != null) {
                target.handleMessage(msg);
            }
        }
    }
    public void handleMessage(Message msg) {
        switch (msg.what)  {
            case SHOW_NETWORK_DIALOG:
                titleResource = R.string.msg_alert_no_network_title;
                messageResource = R.string.msg_alert_no_network_message;
                showDialog();
                break;
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web_view);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportLoaderManager().initLoader(0, null, this);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    private void loadViewData() {
        //Logic to load content.
    }

    @Override
    public Loader<JSONObject> onCreateLoader(int arg0, Bundle arg1) {
        if (handler == null){
            handler = new IncomingHandler(TermsAndConditions.this);
        }
        return new JsonLoader(this);
    }

    @Override
    public void onLoadFinished(Loader<JSONObject> arg0, JSONObject jsonData) {
        if(jsonDataObject==null || jsonDataObject.length()==0) {
            handler.sendEmptyMessage(SHOW_NETWORK_DIALOG);
        } else {
            loadViewData();
        }
    }

    @Override
    public void onLoaderReset(Loader<JSONObject> arg0) {
        if(jsonDataObject==null || jsonDataObject.length()==0) {
            handler.sendEmptyMessage(SHOW_NETWORK_DIALOG);
        } else {
            loadViewData();
        }
    }

    public static class JsonLoader extends AsyncTaskLoader<JSONObject> {
        public JsonLoader(Context context) {
            super(context);
        }

        @Override 
        protected void onStartLoading() {
            if (jsonDataObject != null) {
                deliverResult(jsonDataObject);
            }
            if (takeContentChanged() || jsonDataObject == null) {
                forceLoad();
            }
        }

        @Override
        public JSONObject loadInBackground() {
            try {
                return response.getJSONObject("result");
            } catch (JSONException e) {
                return null;
            } catch (Throwable e) {
                return null;
            }
        }

        @Override 
        public void deliverResult(JSONObject newJsonData) {
            if (isReset()) {
                if (jsonDataObject != null) {
                    onReleaseResources(jsonDataObject);
                }
            }
            JSONObject oldData = jsonDataObject;
            jsonDataObject = newJsonData;
            if (isStarted()) {
                super.deliverResult(jsonDataObject);
            }
            if (oldData != null) {
                onReleaseResources(oldData);
            }
        }

        @Override 
        protected void onStopLoading() {
            cancelLoad();
        }

        @Override public void onCanceled(JSONObject jsonData) {
            super.onCanceled(jsonData);
            onReleaseResources(jsonData);
        }

        @Override protected void onReset() {
            super.onReset();
            onStopLoading();
            if (jsonDataObject != null) {
                onReleaseResources(jsonDataObject);
                jsonDataObject = null;
            }
        }

        protected void onReleaseResources(JSONObject jsonData) {
            jsonData = null;
        }
    }
    public static class MyAlertDialogFragment extends DialogFragment {
        public static MyAlertDialogFragment newInstance(int title) {
            MyAlertDialogFragment frag = new MyAlertDialogFragment();
            Bundle args = new Bundle();
            args.putInt("title", title);
            frag.setArguments(args);
            return frag;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            int title = getArguments().getInt("title");
            return new AlertDialog.Builder(getActivity())
                    .setTitle(title)
                    .setMessage(messageResource)
                    .setPositiveButton(R.string.alert_dialog_ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {

                            }
                        }
                    )
                    .create();
        }
    }
    public void showDialog() {
        DialogFragment newFragment = MyAlertDialogFragment.newInstance(titleResource);
        newFragment.show(getSupportFragmentManager(), "my_dialog");
    }
}

解决方案

Here is the answer in another thread:

Actions in onActivityResult and "Error Can not perform this action after onSaveInstanceState"

also here:

Refreshing my fragment not working like I thought it should

This is an example solving this problem:

DialogFragment loadingDialog = createDialog();

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.add(loadingDialog, "loading");
                    transaction.commitAllowingStateLoss();  

这篇关于java.lang.IllegalStateException:不能的onSaveInstanceState后与DialogFragment执行此操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆