我需要为我的活动的纵向和横向方向应用不同的布局。此外,如果方向是肖像,我需要显示警报。
我在AndroidManifest中指定了android:configChanges="orientation|keyboardHidden"
。我也像这样重写onConfigurationChanged方法:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
Log.d("tag", "config changed");
super.onConfigurationChanged(newConfig);
int orientation = newConfig.orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT)
Log.d("tag", "Portrait");
else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
Log.d("tag", "Landscape");
else
Log.w("tag", "other: " + orientation);
....
}
从横向旋转到纵向日志时看起来像:
config changed
Portrait
但是从纵向更改为横向时,它看起来像
config changed
Portrait
config changed
Landscape
为什么onConfigurationChanged被调用两次?我怎么能避免它?
答案 0 :(得分:3)
请在此处查看我对其他问题的回答:https://stackoverflow.com/a/3252547/338479
简而言之,很难正确处理配置更改。最好实现onRetainNonConfigurationInstance(),它是在您的应用程序即将因配置更改而停止和重新启动之前调用的。使用此方法保存您想要的任何内容('这个'是一个不错的选择),然后让系统拆除您的应用程序。
当您的应用使用新配置重新启动时,请使用getLastNonConfigurationInstance()检索您刚刚保存的状态,然后使用它来继续您的应用程序,而无需使用捆绑包和共享偏好设置。
答案 1 :(得分:1)
您只需保存上一个方向并检查它是否真的发生了变化。
如果您为AndroidManifest.xml
android:configChanges
设置keyboardHidden|orientation
活动,onCreate
等等,则无法呼叫。这使得实现更加容易实现。但当然布局也会从纵向变为景观。
答案 2 :(得分:0)
您选择以这种方式处理轮换有什么特别的原因吗?虽然它更快,因为活动不会在方向更改时重新启动,但如果我没记错的话,通常不建议这样做。另一种处理方向更改的方法是覆盖onConfigurationChanged()
,而不是覆盖onCreate()
,onStart()
或onResume()
,以便
@Override
public void onStart() {
super.onStart();
int orientation = getWindowManager().getDefaultDisplay().getOrientation();
if(orientation == Configuration.ORIENTATION_PORTRAIT) {
Log.i(TAG, "Orientation is portrait");
// show whatever alerts here
}
}
然后指定两个布局 - 一个用于纵向,一个用于横向。布局的纵向版本将保留为res/layout/whatever.xml
,横向版本将保留在res/layout-land/whatever.xml
中。 AndroidGuys写了很多关于这个主题的好文章,请参阅http://androidguys.com/?s=rotational+forces&x=9&y=9
答案 3 :(得分:0)
我很确定你会想要使用onCreate而不是onStart。唯一的区别似乎是当应用程序到达前台时将调用onStart。这不是您希望让用户等待您重新初始化UI的情况。否则,只需根据if条件更改setContentView调用。
答案 4 :(得分:0)
Android在更改方向时会启动活动的新实例,因此使用onCreate是理想的方法。您必须明确保存/恢复活动的数据,以便从中断的地方继续 - 但无论如何您应该这样做,因为任何数量的事件都可能会使您的应用程序失去焦点/终止。