DialogFragment方向更改崩溃与getActivity()

tan*_*0th 5 android orientation

我目前在使用DialogFragments时遇到了一些问题.我正在使用最新的v.4支持包(我相信修订版8)我的问题是,如果在对话框打开时手机的方向发生变化,应用程序开始表现得很糟糕.

目前我的应用程序的工作方式如下:有一个FragmentActivity,它调用Fragment.然后,此Fragment调用DialogFragment(通过getActivity().getSupportFragmentManager().

如果在对话框打开时方向发生变化,则Fragment中的getActivity()= null.如果我想完成活动等,这会导致问题.

要启用此功能,请打开对话框,更改方向并按下按钮.只有在按下按钮后它才会崩溃

我的DialogFragment称为AlertDialogFragment:

public class AlertDialogFragment extends DialogFragment {
private static Builder mBuilder;
private static DialogInterface.OnClickListener mListener;

public static AlertDialogFragment newInstance(Context context, DialogInterface.OnClickListener listener) {
    mBuilder = new AlertDialog.Builder(context);
    mListener = listener;       
    return new AlertDialogFragment();
}

//... some functions to set Icons etc

public void setButton(int whichButton, CharSequence buttonText) {
    final DialogInterface.OnClickListener listener = mListener == null ? null : mListener;      
    mBuilder.setPositiveButton(buttonText, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                listener.onClick(dialog, whichButton);
            }
    });
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return mBuilder.create();
}
}
Run Code Online (Sandbox Code Playgroud)

这是碎片:

public class TestBedFragment extends Fragment implements DialogInterface.OnClickListener   {
// onCreateView Stuff  

private void showCrashDialog() {
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    AlertDialogFragment newDialog = AlertDialogFragment.newInstance(getActivity(), this);
    newDialog.setTitle("Test");     
    newDialog.setIcon(android.R.drawable.ic_dialog_alert);
    newDialog.setMessage("Testing testing testing... 1, 2, 3... Just press Ok.");
    newDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Ok");
    newDialog.show(ft, "dialog");

    // Cause the problem. Simulate the user turning the screen
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

@Override
public void onClick(DialogInterface dialog, int which) {

    /*
     * hexnumber = a hex number
     * Normally equals: TestBedFragment{hexnumber #0 id=hexnumber}
     * With crash equals: TestBedFragment{hexnumber}
     */
    Log.e("TestBedFragment", "this = " + this);

    /*
     * hexnumber = a hex number
     * Normally equals: com.example.TestBed.TestBedActivity@hexnumber
     * With crash equals: null
     */
    Log.e("TestBedFragment", "getActivity() = " + getActivity()); // Will equal null... ???

    getActivity().finish();
}
}
Run Code Online (Sandbox Code Playgroud)

我不太确定这是什么导致的?对不起,如果这是一个愚蠢的问题.我在其他地方读过关于'Windows Leaking'的内容,但我还没有在logcat中看到过这些内容.

任何人都可以帮助我:)非常感谢

谢谢

Bar*_*rak 0

您正在重新创建所有内容,而不是使用捆绑包。添加if到您的 onCreateDialog 以检查空包。如果它为空,则执行您的创建操作,否则不执行任何操作,Android 将从捆绑包中恢复所有内容。

我认为这会解决你的问题。

if(SavesIinstanceState == null); {
    // your code
}
Run Code Online (Sandbox Code Playgroud)