我试图为我的Android应用程序处理屏幕方向更改但没有成功。 这是我的清单:
<activity
android:name="fr.ups.l3info.l3info_catchgameactivity.CatchGameActivity"
android:label="@string/app_name"
android:screenOrientation="user"
android:configChanges="orientation|keyboardHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
我在我的活动类中添加了这个函数:
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
但是当我更改屏幕方向时,将重新创建应用程序并且永远不会执行此功能。我做错了什么?谢谢你的帮助。
答案 0 :(得分:3)
在清单中使用此功能
android:configChanges="keyboardHidden|orientation|screenSize|layoutDirection"
答案 1 :(得分:2)
您可能想要阅读有关活动生命周期的更多信息。你可以在这里找到更多(http://developer.android.com/training/basics/activity-lifecycle/index.html)
但更重要的是熟悉您的活动状态。
您要查找的方法不是onConfigurationChanged(Configuration newConfig)
,而是onSaveInstanceState(Bundle savedInstanceState)
。
现在,在OnCreate()
方法中,您需要检查是否已保存某个状态,然后重新创建该情况。
此链接有一个非常好的解释:Saving Android Activity state using Save Instance State
但基本上你需要做的是:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
然后考虑到这一点:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
STATE_SCORE
和STATE_LEVEL
是一些public static final String
值,用于以某种方式标记您要保存的内容。
例如,如果您有EditText视图,并输入内容,然后旋转屏幕,该值将丢失。但是在您的onSaveInstanceState()
方法中,您将使用该Bundle
参数并将EditText视图的值作为String。
保存后,现在您可以在onCreate()
方法中获取该值,并将EditText视图的值设置为该值。
希望这会有所帮助:)
答案 2 :(得分:0)
如果您正在尝试定义不同的布局&#34;当方向发生变化时,只需定义新的布局,将同名设置为其他布局,并将其放在res/layout-land
下。
因此,当您的应用程序重新创建并在setContentView(layout_name)
函数中调用onCreate
时,它将调用res/layout-land
下的而不是res/layout
下的{。}}。