如何在Android中运行时更改方向时保持弹出窗口打开?

时间:2012-03-03 12:14:59

标签: android android-orientation

我创建了一个弹出窗口,其中包含月视图以获取日期。当我改变方向时,由于Android再次加载活动,我的弹出窗口会消失。即使在运行时方向发生变化,如何才能打开它?

4 个答案:

答案 0 :(得分:5)

AndroidManifest.xml 中的android:configChanges="orientation"包含在活动显示窗口中。这样做会告诉android你将自己处理方向更改,最终它不会破坏你的活动并保持窗口的显示。

如果您没有纵向和横向模式的不同布局,这种技术很好。但是,如果这样做,您仍可以通过检测方向模式执行自定义布局实现,如下所示:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
        Log.i("orientation", "Orientation changed to: Landscape");
    else
        Log.i("orientation", "Orientation changed to: Portrait");
}

预览,下载并安装this sample app

答案 1 :(得分:4)

每当有方向更改时,Android会破坏您的活动(调用onDestroy()),然后重新启动它(调用onCreate())。
弹出窗口启动后,立即设置标记popup_open=1。你的弹出窗口自然会有一个关闭按钮。在此按钮的单击处理程序中设置flag = 0。然后,您可以在方法onRestoreInstanceState()onCreate()中重新启动应用时重新打开弹出窗口。在这里你可以检查一下这面旗帜。如果该标志设置为1,则弹出弹出窗口。因此,即使在弹出窗口启动时方向发生变化,onRestoreInstanceState()也会根据旗帜的状态知道该怎么做。 有关更多参考检查:How to handle runtime changes

答案 2 :(得分:1)

将此属性添加到manifest.xml

中的活动
android:configChanges="orientation|keyboard" 

那应该这样做。

答案 3 :(得分:0)

将PopupWindow显示为

final View parent = findViewById(R.id.{parentId});
parent.post(new Runnable() {
    @Override
    public void run() {
        mPopup.showAtLocation(parent, ...);
    }
});

解决方向更改时未处理的异常