Android:编程的';允许重新定向';偏好只起作用一次
我有一个复选框首选项,键为“允许重新定向”。如果启用,则我的主要活动应在设备旋转时重新定向,如果禁用,则应保持其当前方向。我在manifest.xml中设置了“android:configChanges=“orientation”,以允许自定义处理方向更改 从我的主要活动课:Android:编程的';允许重新定向';偏好只起作用一次,android,configuration,orientation,Android,Configuration,Orientation,我有一个复选框首选项,键为“允许重新定向”。如果启用,则我的主要活动应在设备旋转时重新定向,如果禁用,则应保持其当前方向。我在manifest.xml中设置了“android:configChanges=“orientation”,以允许自定义处理方向更改 从我的主要活动课: @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChange
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
if (preferences.getBoolean("allow_reorientation", true)) {
switch(newConfig.orientation) {
case Configuration.ORIENTATION_PORTRAIT:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case Configuration.ORIENTATION_LANDSCAPE:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
default:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
break;
}
}
}
如果我在纵向模式下启动应用程序,然后将设备旋转到横向模式,则会调用上面的代码并按需要运行。但是,当旋转回“纵向”时,根本不调用该方法,当然视图仍保留在“横向”中
我的第一个猜测是,由于我没有将“newConfig.orientation”存储在任何位置,因此第二次重新定向回纵向是将最新的方向值与仍然指示纵向方向的预先存在的值进行比较,因此未检测到配置更改。然而,如果这是真的,那么当我第二次尝试定向到横向时,我在上述方法中设置的断点将被激活,但是在这种情况下,该方法永远不会被调用
有人能解释一下发生了什么事,并提出补救办法吗
非常感谢
解决方案-感谢下面的Matthew Willis
在扩展应用程序的YourApp中:
public void updateOrientationConfiguration(Activity activity) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
if (preferences.getBoolean("allow_reorientation", true)) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
} else {
if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
}
在扩展活动的活动中:
public void onResume() {
super.onResume();
YourApp app = (YourApp)this.getApplication();
app.updateOrientationConfiguration(this);
}
另一种方法是使用和 基本上,您可以根据自己的偏好设置一个或另一个,然后不必实现
onConfigurationChanged
(或在清单中设置configChanges
)
示例活动:
public class Main extends Activity {
private static boolean locked = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
doLock();
}
public void doLock() {
if (locked) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
public void toggle(View v) {
locked = !locked;
doLock();
}
}
在测试中,我注意到,
屏幕方向传感器
也会导致旋转到默认方向,因此有必要明确使用\u横向
和\u纵向
。我不确定,但它可能很奇怪——我希望它会触发——当它被调用时,它可能值得重写以进行测试
你是在改变方向后做功能测试,还是只是看着屏幕?这可能是超级。是布局更改的地方,当您调用
希望这有帮助
菲尔·莱洛嗨,菲尔,谢谢你的建议。但是,正如前面提到的,我的原始方法中有一个断点,如果该方法是递归的,它会被多次命中。非常感谢Matthew,这正是我所要求的:)我将其包装在我的应用程序子类中的updateOrientationConfiguration(Activity Activity)函数中,现在在onResume()中调用它进行必要的活动。我感谢你的帮助。