我有一个使用Android-support-v4片段API的“hello world”样例应用程序。
该 Activity 包含一个按钮,单击该按钮将显示一个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);
    }
}

最佳答案

对此发表评论:

“即使使用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();
}

07-26 09:39