Android 在屏幕旋转之前做些什么?

Android 在屏幕旋转之前做些什么?,android,android-fragments,android-manifest,screen-orientation,onconfigurationchanged,Android,Android Fragments,Android Manifest,Screen Orientation,Onconfigurationchanged,每当设备从纵向旋转到横向时,我想做一些事情() 我已在清单中添加了。因此,每当我旋转设备时,都会调用onConfigurationChanged()。而且它不会重新创建活动 在myOnConfiguration Changed()函数中: @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newCo

每当设备从纵向旋转到横向时,我想
做一些事情()

我已在清单中添加了
。因此,每当我旋转设备时,都会调用
onConfigurationChanged()
。而且它不会重新创建活动

在my
OnConfiguration Changed()函数中:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        do_something();
    }
    then_fire_off_the_screen_rotation_as_normal();
    // which means re-start the Activity
    // i expect it will fire off onSaveInstanceState() -> onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
}
我的问题是,我不知道我能在
中做什么,然后按正常方式启动屏幕旋转()

我尝试过使用
setRequestedOrientation()
,但它似乎不是用于此目的的函数:

当我传入
ActivityInfo.SCREEN\u ORIENTATION\u UNSPECIFIED
ActivityInfo.SCREEN\u ORIENTATION\u SENSOR
ActivityInfo.SCREEN\u ORIENTATION\u USER
时,活动仍然没有重新启动。(就像不打电话一样。)

当我进入ActivityInfo.SCREEN\u ORIENTATION\u NOSENSOR
时,方向传感器关闭。(正如上面所说。)

当我传入
ActivityInfo.SCREEN\u ORIENTATION\u scape
时,该活动是强制关闭的,使用
AndroidRuntime:NullPointerException


(请具体说明:这是因为在纵向布局中以编程方式添加了片段,但在横向布局中没有。在
do\u something()
函数中,我将删除这些片段,因为横向模式中不需要它们。)

onPause()、onStop()等将触发的假设是不正确的。通过使用
onConfigurationChanged
您告诉Android不要执行这些步骤,相反,您将在临时变量中处理布局信息的保存,然后调用
InitializeUI()
,然后将布局设置回您想要的方式。我将发布一个例子,我有类似的东西,并在一个时刻为我工作

编辑:这是示例

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);
    Log.i("configChange", "configChange");

    String tmp = connect.getText().toString();
    boolean onTmp = on.isEnabled();
    boolean offTmp = off.isEnabled();
    boolean connTmp = reconnect.isEnabled();

    InitializeUI();

    connect.setText(tmp);
    on.setEnabled(onTmp);
    off.setEnabled(offTmp);
    reconnect.setEnabled(connTmp);
}
现在,我的
InitializeUI()
方法只不过是一堆findViewById,并查看onClickListeners。还要确保在
onCreate()中调用
InitializeUI()

希望这对你有所帮助

onPause()、onStop()等将触发的假设是不正确的。通过使用
onConfigurationChanged
您告诉Android不要执行这些步骤,相反,您将在临时变量中处理布局信息的保存,然后调用
InitializeUI()
,然后将布局设置回您想要的方式。我将发布一个例子,我有类似的东西,并在一个时刻为我工作

编辑:这是示例

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);
    Log.i("configChange", "configChange");

    String tmp = connect.getText().toString();
    boolean onTmp = on.isEnabled();
    boolean offTmp = off.isEnabled();
    boolean connTmp = reconnect.isEnabled();

    InitializeUI();

    connect.setText(tmp);
    on.setEnabled(onTmp);
    off.setEnabled(offTmp);
    reconnect.setEnabled(connTmp);
}
现在,我的
InitializeUI()
方法只不过是一堆findViewById,并查看onClickListeners。还要确保在
onCreate()中调用
InitializeUI()


希望这对你有所帮助

好吧,我想这个简单的方法可以满足我的需求:

不添加
只是我的猜测。如果你对此有任何想法,请回答。谢谢


那么,对上述方法的进一步改进,解决了第一条评论中提出的问题:(仍然很简单)

isDevicePortrait()
将如下所示:

private boolean isDevicePortrait() {
    return (findViewById(R.id.A_View_Only_In_Portrait) != null);
}
*请注意,我们不能使用
getResources().getConfiguration().orientation
来确定设备当前是否正常运行。这是因为
Resources
对象在屏幕旋转之后立即被更改-甚至在调用
onSaveInstanceState()
之前


如果您不想使用
findViewById()
来测试方向(出于任何原因,它毕竟不是那么整洁),请保留一个全局变量
private int current\u orientation并通过
current\u orientation=getResources().getConfiguration().orientation初始化它
onCreate()
中。这看起来更整洁。但是我们应该意识到,在活动生命周期中,不要在任何地方更改它。

好吧,我想这个简单的方法可以满足我的需求:

不添加
只是我的猜测。如果你对此有任何想法,请回答。谢谢


那么,对上述方法的进一步改进,解决了第一条评论中提出的问题:(仍然很简单)

isDevicePortrait()
将如下所示:

private boolean isDevicePortrait() {
    return (findViewById(R.id.A_View_Only_In_Portrait) != null);
}
*请注意,我们不能使用
getResources().getConfiguration().orientation
来确定设备当前是否正常运行。这是因为
Resources
对象在屏幕旋转之后立即被更改-甚至在调用
onSaveInstanceState()
之前


如果您不想使用
findViewById()
来测试方向(出于任何原因,它毕竟不是那么整洁),请保留一个全局变量
private int current\u orientation并通过
current\u orientation=getResources().getConfiguration().orientation初始化它
onCreate()
中。这看起来更整洁。但是我们应该意识到,在活动生命周期中,不要在任何地方更改它。

感谢您的回复@TronicZomB。我也想过这种方法。您的示例确实提醒我在
InitializeUI()
之前保存状态,然后再恢复它们。但是,在阅读你的建议时,我想出了一个解决方案,我认为它更简单,可以解决我的问题。如果它有任何缺点,请纠正我:)您提出的新解决方案是什么?谢谢您的回复@TronicZomB。我也想过这种方法。您的示例确实提醒我在
InitializeUI()
之前保存状态,然后再恢复它们。但是,在阅读你的建议时,我想出了一个解决方案,我认为它更简单,可以解决我的问题。如果它有任何缺点,请纠正我:)你提出的新解决方案是什么?嗯,我已经提过了
private boolean isDevicePortrait() {
    return (findViewById(R.id.A_View_Only_In_Portrait) != null);
}