在片段中,屏幕方向更改时对话框框消失

4

我并不是非常有经验的安卓程序员,所以请对我温柔点 :)

我正在尝试创建一个应用程序,使用片段并且在其中一个片段中调用自定义对话框。

//create dialog
final Dialog dialog = new Dialog(getActivity());
dialog.setCancelable(false);
dialog.setContentView(R.layout.fragment_update_dialog);

//set up data in dialog here

Button bUpdate = (Button) dialog.findViewById(R.id.bDialogUpdate);
bUpdate.setOnClickListener(new OnClickListener() 
{
//define onclick listener code here
});
dialog.show();

这段代码工作得很好,我没有遇到任何问题。但是当屏幕方向改变时,我的对话框消失了。
现在我已经在论坛和其他地方阅读了几篇帖子,所以我明白这是为什么,但我找不到停止它的解决方案。
我尝试了使用清单文件中的“技巧”,但它并不起作用。(可能是因为它在片段而不是活动中?)
我的清单文件包括;
<activity
        android:name="com.mycompany.myapp.MainActivity"
        android:configChanges="keyboardHidden|orientation"
....

在我的主活动中,我有以下内容:

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
setContentView(R.layout.activity_main);
}

但这并不起作用。
我也看到很多评论说这不被推荐,但是看不到如何解决这个问题。
感谢您的帮助。

1
请在此链接中检查我的答案:http://stackoverflow.com/questions/16580768/alertdialog-is-disappears-while-reload-the-activity-in-android/16581426#16581426。 - Neoh
抱歉,但那是用于AlertDialog而不是自定义对话框。 - jason.kaisersmith
哦,你可以用任何你喜欢的对话来替换它。 - Neoh
3个回答

13

尝试使用 DialogFragment 替代。在方向改变后,它可以重新启动。你需要按照文档所示扩展这个类,并使用它来显示对话框。


我曾考虑过这样做,但遇到了其他问题。其中一个问题是我无法从另一个片段中调用DialogFragment。我在网上找到的所有示例都是从活动中调用的,而且我甚至无法编译代码。 - jason.kaisersmith
@jason.kaisersmith 这里有一个例子,展示了如何从另一个fragment中显示DialogFragment:CustomDialogFragment dialog = new CustomDialogFragment(); dialog.show(getFragmentManager(), "tag"); 你可以在我提供的官方文档链接中找到如何创建自定义DialogFragment的方法。 - Yoric
3
DialogFragment是最好的选择。不需要对清单文件进行不建议的更改。 - dennisdrew

10

在 API 13 及之前,configChanges 属性有一个新值 screenSize。

因此,如果你正在使用大屏幕,请确保在 configChanges 属性中添加 screenSize:

android:configChanges="orientation|keyboardHidden|screenSize"

<activity
    android:name=".MyMainActivity"
    android:configChanges="orientation|keyboardHidden|screenSize" 
    android:label="@string/app_name" >

参考文献


这解决了对话框消失的问题(太棒了,谢谢),但又出现了另一个问题!现在,对话框保留了下来,我可以执行更新操作。但是当它返回到片段时,我的片段视图已经消失了,所有的内容(文本框、旋转器等)都不见了。那么我现在做错了什么? - jason.kaisersmith

0

无意中我发现了一种方法,可以使您的对话框在设备方向更改时保持不变。

这是C# Xamarin代码,但我相信它也可以很容易地适应Java。

    private void MakeDialogPersist(Dialog dialog)
    {
        WindowManagerLayoutParams wmlp = new WindowManagerLayoutParams();
        wmlp.CopyFrom(dialog.Window.Attributes);
        dialog.Window.Attributes = wmlp;
    }

我在执行 dialog.Show() 方法之后运行这个方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接