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()
。而且它不会重新创建活动
在myOnConfiguration 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);
}