尽管setRetainInstance(true),DialogFragment在旋转时消失

use*_*237 22 android

我有一个"hello world" - 使用android-support-v4片段API的示例应用程序.该活动包含一个按钮,单击它将显示DialogFragment.但是,即使使用setRetainInstance(true),像旋转这样的配置更改也会导致对话框消失.

知道如何解决这个问题吗?

RetFragment.java

package me.local.HelloFroyo;

import android.os.Bundle;
import android.support.v4.app.*;
import android.util.Log;
import android.view.*;

public class RetFragment extends DialogFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.hello_dialog_fragment, container);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("RET", "onDestroy");
    }
}
Run Code Online (Sandbox Code Playgroud)

MainActivity.java

package me.local.HelloFroyo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;

public class MainActivity extends FragmentActivity {

    private static final String TAG_DLG = "myFragDlg";

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_main);
    }

    public void onShowClick(View v) {
        RetFragment ret = new RetFragment();
        ret.show(getSupportFragmentManager(), TAG_DLG);
    }
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ney 30

只是评论一下:

"即使使用了setRetainInstance(true)."

这不是"即使",也不是"因为它".如果setRetainInstance为false,则对话框旋转正常.

这是我在这里找到的工作,对我来说很好用:http: //code.google.com/p/android/issues/detail?id = 17423

@Override
public void onDestroyView()
{
    Dialog dialog = getDialog();

    // Work around bug: http://code.google.com/p/android/issues/detail?id=17423
    if ((dialog != null) && getRetainInstance())
        dialog.setDismissMessage(null);

    super.onDestroyView();
}
Run Code Online (Sandbox Code Playgroud)

  • 基于此:http://stackoverflow.com/a/11318942/1041533我会说如果setRetainInstance设置为true,则维护整个片段的状态(除了它的视图 - 需要重新创建的视图).所以你对重建的整个片段的说法,因为setRetainInstance(true)似乎不太正确,但情况恰恰相反? (2认同)

And*_*cko 5

DialogFragments自行完成轮换更改,不需要setRetainInstance

但是,如果你设置它,这是一个可重现的错误与setRetainInstance(true)和DialogFragments

http://code.google.com/p/android/issues/detail?id=17423&q=setRetaininstance&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

只是没有setRetainInstance,你的对话框将正常工作

但是,如果您在DialogFragment中运行AsyncTask并且想要保留它,则使用带有AsyncTaskLoader的LoaderManager ..它也可以在配置更改中幸存下来