如何处理屏幕方向更改

时间:2014-03-24 19:39:22

标签: java android

我试图为我的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);
}

但是当我更改屏幕方向时,将重新创建应用程序并且永远不会执行此功能。我做错了什么?谢谢你的帮助。

3 个答案:

答案 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_SCORESTATE_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下的{。}}。