23

我有一个使用 android-support-v4 片段 API 的“hello world”-ish 示例应用程序。该活动由一个按钮组成,单击它将显示一个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");
    }
}

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);
    }
}
4

4 回答 4

32

只是对此发表评论:

“即使使用了 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();
}
于 2012-11-28T01:47:56.503 回答
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

只是不要设置保留实例,您的对话框将正常工作

但是,如果您的 DialogFragment 中有一个 AsyncTask 正在运行并且您希望将其持久化,请使用 LoaderManager 和 AsyncTaskLoader.. 它也可以在配置更改后继续存在

于 2012-12-07T19:04:30.603 回答
1

对于那些即使在setRetainInstance(true)覆盖或覆盖后onDestroyView仍有问题但仍然无法工作的人,请确保super.onSaveInstanceState()在覆盖时调用onSaveInstanceState

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState); // <-- must call this if you want to retain dialogFragment upon rotation
    ...
}

即使没有 setRetainInstance 或覆盖 onDestroyView,dialogFragment 也应该在旋转时自行处理对话重新创建。

于 2013-09-23T08:18:37.610 回答
-13

尝试添加

android:configChanges="orientation"

在 AndroidManifest 文件中再次显示您的活动。

于 2012-07-03T09:09:02.023 回答