android - DialogFragment 方向更改与 getActivity() 崩溃

标签 android orientation

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

目前我的应用程序是这样工作的: 有一个FragmentActivity,它调用一个Fragment。 这个 Fragment 然后调用一个 DialogFragment(通过 getActivity().getSupportFragmentManager()。

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

为此,您打开对话框,更改方向并按下按钮。只有在你按下按钮后它才会崩溃

我的 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();
}
}

这是 fragment :

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

我不太确定是什么原因造成的?抱歉,这是一个愚蠢的问题。我在其他地方读到过有关“Windows 泄漏”的信息,但我没有在 logcat 中看到任何关于该内容的提及。

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

谢谢

最佳答案

你必须了解 Activity 生命周期。每次旋转设备时,都会重新创建 Activity 。这意味着该类的一个新实例正在执行。

在您的代码中发生的情况是,在轮换之后,监听器在先前的对话框实例上调用 getActivity,引用先前的 Activity 。但是这个activity已经失效了,轮换后已经“销毁”了,出现了一个新的。

您对 getActivity 的调用不再有效。

在 fragment onDestroy 方法期间,您不能关闭打开的对话框吗?

关于android - DialogFragment 方向更改与 getActivity() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10542926/

相关文章:

java - 防止 Volley 同时发送相同的请求

android - 在方向改变时管理 Activity 状态 (Android)

objective-c - 有没有办法轻松改变界面方向?

ios - 自动布局方向不起作用

ms-word - 当我更改页面方向时重新开始页码 - Microsoft Office

Android Studio Gradle Build 耗时超过 5 分钟

Android:点击时生成随机颜色?

java - 如何在应用程序关闭时保持服务在后台运行,但在应用程序处于前台时停止/禁用它?

不支持 google api 的手机的 Android 应用程序崩溃

android - ExpandableListView 中的方向更改折叠子项