Java 如何处理屏幕方向的变化

Java 如何处理屏幕方向的变化,java,android,Java,Android,我正在尝试为我的android应用程序处理屏幕方向的变化,但没有成功。 这是我的舱单: <activity android:name="fr.ups.l3info.l3info_catchgameactivity.CatchGameActivity" android:label="@string/app_name" android:screenOrientation="user" android:configChange

我正在尝试为我的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>
但是,当我更改屏幕方向时,应用程序将被重新创建,并且此函数永远不会执行。我做错了什么?谢谢你的帮助

在清单中使用此选项 android:configChanges=keyboardHidden |方向|屏幕大小|布局方向

在清单中使用此选项
android:configChanges=keyboardHidden | orientation | screenSize | layoutDirection

如果您试图在方向发生变化时为应用程序定义不同的布局,只需定义一个新布局,将其命名为与其他布局相同的名称,并将其置于res/layout land下即可


这样,当应用程序重新创建自身并在onCreate函数中调用setContentViewlayout_name时,它将调用res/layout下的land,而不是res/layout下的land。

如果您试图在方向改变时为应用程序定义不同的布局,只需定义一个新布局,将其命名为与其他布局相同的名称,并将其置于res/layout land下


因此,当应用程序重新创建自身并在onCreate函数中调用setContentViewlayout_name时,它将调用res/layout下的land,而不是res/layout下的land。

您可能想了解更多有关活动生命周期的信息。你可以在这里找到更多

但更重要的是熟悉你的活动状态

您要查找的方法不是OnConfiguration ChangedConfiguration newConfig,而是onSaveInstanceStateBundle savedInstanceState

现在,在OnCreate方法中,您需要检查是否已经保存了某些状态,然后重新创建该状态

这个链接有一个很好的解释:

但基本上你需要做的是:

@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是一些公共静态最终字符串值,用于以某种方式标记要保存的内容

例如,如果您有EditText视图,并且您键入了一些内容,然后旋转屏幕,则该值将丢失。但在onSaveInstanceState方法中,应使用该Bundle参数并将EditText视图的值作为字符串

保存后,现在可以在onCreate方法中获取该值,并将EditText视图的值设置为该值


希望这对您有所帮助:

您可能想了解更多有关活动生命周期的信息。你可以在这里找到更多

但更重要的是熟悉你的活动状态

您要查找的方法不是OnConfiguration ChangedConfiguration newConfig,而是onSaveInstanceStateBundle savedInstanceState

现在,在OnCreate方法中,您需要检查是否已经保存了某些状态,然后重新创建该状态

这个链接有一个很好的解释:

但基本上你需要做的是:

@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是一些公共静态最终字符串值,用于以某种方式标记要保存的内容

例如,如果您有EditText视图,并且您键入了一些内容,然后旋转屏幕,则该值将丢失。但在onSaveInstanceState方法中,应使用该Bundle参数并将EditText视图的值作为字符串

保存后,现在可以在onCreate方法中获取该值,并将EditText视图的值设置为该值


希望这有帮助:

我认为更改方向总是会重新创建活动。您如何知道该函数从未被调用?我认为更改方向总是会重新创建活动。您如何知道该函数从未被调用?这是最后一个资源解决方案,应尽可能避免使用它。但我读过的所有教程都说只需添加android:configChanges=orientation | KeyboardHidden文档中说“如果您的应用程序的目标API级别为13或更高,如minSdkVersion和targetSdkVersion属性所声明的,那么您还应该声明屏幕大小配置,因为当一台设备在纵向和横向之间切换时,它也会发生变化。“这是最后一个资源解决方案,应该尽可能避免使用它。”。但我读过的所有教程都说只需添加android:configChanges=orientation | KeyboardHidden文档中说“如果您的应用程序的目标API级别为13或更高,如minSdkVersion和targetSdkVersion属性所声明的,那么您还应该声明屏幕大小配置,因为当设备在纵向和横向之间切换时,它也会发生变化。我遇到的问题是我不能保存我可以保存但很难实现的对象。你真的需要屏幕旋转吗。如果没有,您可以通过在清单中添加旋转属性来锁定旋转。但是如果你需要旋转,还有一个技巧。让我知道你需要什么
是的,我需要屏幕旋转如果你使用MVC模式,也许你的问题的解决方案是保存你的整个控制器。解决这个问题的一个方法是将其保存到文件中。但是您的控制器需要实现Serializable,它的所有字段也需要实现Serializable。如果您的控制器或您试图保存的任何类中有一个视图,这是不可能的,但是在控制器中也有视图也是错误的。如果你需要任何帮助,请告诉我。如果你再多写一些代码,会很有帮助的。谢谢你的帮助。我不是在处理复杂的应用程序。但我明白你的意思了。我将存储对象,然后在重新创建应用程序时再次读取。是的,我以前读过。我遇到的问题是我不能保存我可以保存但很难实现的对象。你真的需要屏幕旋转吗。如果没有,您可以通过在清单中添加旋转属性来锁定旋转。但是如果你需要旋转,还有一个技巧。让我知道你需要什么。是的,我需要屏幕旋转如果你使用MVC模式,也许你的问题的解决方案是保存你的整个控制器。解决这个问题的一个方法是将其保存到文件中。但是您的控制器需要实现Serializable,它的所有字段也需要实现Serializable。如果您的控制器或您试图保存的任何类中有一个视图,这是不可能的,但是在控制器中也有视图也是错误的。如果你需要任何帮助,请告诉我。如果你再多写一些代码,会很有帮助的。谢谢你的帮助。我不是在处理复杂的应用程序。但我明白你的意思了。我将存储该对象,然后在重新创建应用程序时再次读取它。