防止在Android中屏幕旋转时解除对话框

dra*_*sia 91 android dialog onconfigurationchanged android-edittext

我试图阻止在重新启动活动时关闭使用"警报"构建器构建的对话框.

如果我重载onConfigurationChanged方法,我可以成功地执行此操作并重置布局以更正方向,但我丢失了edittext的粘性文本功能.所以在解决对话问题时我创建了这个edittext问题.

如果我从edittext中保存字符串并在onCofiguration更改中重新分配它们,它们似乎仍然默认为初始值而不是在旋转之前输入的值.即使我强制使用无效似乎也会更新它们.

我真的需要解决对话问题或编辑文本问题.

谢谢您的帮助.

Bra*_*bin 126

现在避免这个问题的最好方法是使用a DialogFragment.

创建一个扩展的新类DialogFragment.覆盖onCreateDialog并返回旧的DialogAlertDialog.

然后你可以用它来显示它DialogFragment.show(fragmentManager, tag).

这是一个例子Listener:

public class MyDialogFragment extends DialogFragment {

    public interface YesNoListener {
        void onYes();

        void onNo();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (!(activity instanceof YesNoListener)) {
            throw new ClassCastException(activity.toString() + " must implement YesNoListener");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.dialog_my_title)
                .setMessage(R.string.dialog_my_message)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((YesNoListener) getActivity()).onYes();
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((YesNoListener) getActivity()).onNo();
                    }
                })
                .create();
    }
}
Run Code Online (Sandbox Code Playgroud)

在您调用的活动中:

new MyDialogFragment().show(getSupportFragmentManager(), "tag"); // or getFragmentManager() in API 11+
Run Code Online (Sandbox Code Playgroud)

这个答案有助于解释其他三个问题(及其答案):

  • @faraz_ahmed_kamran,你应该使用`onAttach(Context context)`和`android.support.v4.app.DialogFragment`.`onAttach`方法现在将`context`而不是`activity`作为参数. (3认同)

小智 44

// Prevent dialog dismiss when orientation changes
private static void doKeepDialog(Dialog dialog){
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(dialog.getWindow().getAttributes());
    lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
    dialog.getWindow().setAttributes(lp);
}
Run Code Online (Sandbox Code Playgroud)
public static void doLogout(final Context context){     
        final AlertDialog dialog = new AlertDialog.Builder(context)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle(R.string.titlelogout)
        .setMessage(R.string.logoutconfirm)
        .setPositiveButton("Yes", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ...   
            }

        })
        .setNegativeButton("No", null)      
        .show();    

        doKeepDialog(dialog);
    }
Run Code Online (Sandbox Code Playgroud)

  • 作品,不知道它是如何工作的!清理简单而抽象的解决方案,谢谢. (5认同)
  • 我认为这段代码很糟糕.doLogout()具有对包含活动的上下文的引用.无法销毁活动,这可能导致内存泄漏.我正在寻找从静态上下文中使用AlertDialog的可能性,但现在我确定它是不可能的.我认为结果只能是垃圾. (3认同)
  • 看起来它看起来很有效.对话框保持打开状态,但它与新创建的活动或片段没有任何关联(它在每次方向更改时都会重新创建).所以你不能在对话框按钮`OnClickListener`中做任何需要`Context`的事情. (2认同)
  • 此代码有效,但根本不推荐.它泄漏了活动引用,这就是对话框可以持久化的原因.这是一种非常糟糕的做法,会导致内存泄漏. (2认同)

Mar*_*yer 5

如果您在更改方向时更改布局,我不会将其放入android:configChanges="orientation"清单中,因为无论如何您都在重新创建视图。

使用以下方法保存活动的当前状态(如输入的文本、显示的对话框、显示的数据等):

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

这样,活动再次通过 onCreate,然后调用 onRestoreInstanceState 方法,您可以在其中再次设置 EditText 值。

如果你想存储更复杂的对象,你可以使用

@Override
public Object onRetainNonConfigurationInstance() {
}
Run Code Online (Sandbox Code Playgroud)

在这里您可以存储任何对象,而在 onCreate 中,您只需调用getLastNonConfigurationInstance();即可获取对象。

  • `OnRetainNonConfigurationInstance()` 现在已被弃用,因为 Doc 说:http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance() `setRetainInstance(boolean retain)` 应该被使用:http: //developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) (4认同)