我创建了一个弹出窗口,其中包含月视图以获取日期。当我改变方向时,由于Android再次加载活动,我的弹出窗口会消失。即使在运行时方向发生变化,如何才能打开它?
答案 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, ...);
}
});
解决方向更改时未处理的异常