我有一项活动,只要方向发生变化,它就会重新启动。我已编写代码以防止在清单文件中更改方向时重新启动活动,如下所示:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.sample.appname.MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
在上面的代码片段中, android:configChanges =“orientation | keyboardHidden”应该为我做的工作,但活动仍在重新启动。请让我知道如何纠正它。
答案 0 :(得分:5)
实际上,您不应该阻止重新启动活动。由于多种原因,在轮换更改后重新创建活动是必要的。其中之一是布局必须膨胀以处理改变的屏幕尺寸和类似的东西(很容易想象布局在纵向上完全不同于横向模式)。 但是,有一种方法可以告诉系统您自己处理屏幕更改。因此,更改清单中的行
android:configChanges="orientation|keyboardHidden"
到
android:configChanges="orientation|screenSize"
然后不会重新创建活动。您将通过onConfigurationChanged()
方法获得回调,以便在方向发生变化时执行某些操作。如果您在配置更改时不想执行任何操作,请不要覆盖“活动”中的onConfigurationMethod()
。请阅读this section in the Android Developers API Guide以获取更多信息。
我是从this answer得到的。答案还有两种方法,但我认为上面描述的方法在你的案例中是最好的。
编辑:也许您必须将keyboard|keyboardHidden
添加到android:configChanges
属性中,如this answer中所述
编辑#2:如果您想要检索设备的当前方向,可以拨打
Activity.getResources().getConfiguration().orientation
将返回常量ORIENTATION_PORTRAIT
或ORIENTATION_LANDSCAPE
。
如果您对确切的旋转角度感兴趣,请使用
int rotation = getWindowManager().getDefaultDisplay().getRotation();
并使用描述here的开关案例来实现差异化。
确定设备旋转的第三种方法是getRequestedOrientation()
,它将返回the documentation中定义的常量
答案 1 :(得分:0)
android:configChanges =“orientation | screenSize”表示无论何时更改屏幕方向,都会调用Activity类中的以下方法。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { body }
}
这是andorid的本质,每当屏幕方向改变时,活动的整个生命周期都会再次运行。
保存并恢复某些数据。你可以使用以下方法。
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putString("key","value");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String s = savedInstanceState.getString("key");
}
答案 2 :(得分:0)
尝试更改
android:configChanges="orientation|keyboardHidden"
进入
android:configChanges="orientation|screenSize"
这应该可以解决您的问题,但这不是一种有效的方法,更好的选择参考http://developer.android.com/training/basics/activity-lifecycle/recreating.html