我想在我的应用程序中创建方向设置(“Portrait
”,“Landscape
”,“Auto
”。
我在设置活动中创建了此选项,但我不知道如何在运行时以编程方式将此方向设置设置为我的应用程序(或活动)。
在我onCreate()
的活动中,我尝试过:
sharedPrefSettings = PreferenceManager.getDefaultSharedPreferences(this);
switch (sharedPrefSettings.getString(SettingsActivity.KEY_PREF_SCREEN_ORIENTATION, "0")) {
case "0":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
break;
case "1":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case "2":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
}
但是工作不好:
更改设置时,活动不会立即轮播(我必须重新创建活动才能应用更改)
首次打开应用时,活动处于默认(系统)方向,大约一秒后,它会根据我的设置重新定位。
答案 0 :(得分:1)
来自setRequestedOrientation
的{{3}}:
public void setRequestedOrientation(int requestedOrientation)
更改此活动的所需方向。 如果活动当前处于前台或以其他方式影响 屏幕方向,屏幕将立即更改 (可能导致重新启动活动)。否则,这会 在下次活动可见时使用。
所以它应该像你描述的那样工作,我只是测试它,我不会遇到任何问题或错误。错误必须在其他地方。
错误也可能在这里:
switch (sharedPrefSettings.getString(SettingsActivity.KEY_PREF_SCREEN_ORIENTATION, "0")) {
case "0":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
break;
case "1":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case "2":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
}
您正在String
上使用开关。直到最近,Android才支持。您必须确保您的语言级别设置为1.7,或者您可以使用Integers
或if语句:
switch (sharedPrefSettings.getInt(SettingsActivity.KEY_PREF_SCREEN_ORIENTATION, -1)) {
case 1:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case 2:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
default:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
break;
}
此外,您可以像我刚才那样使用default
来创建更安全,更通用的逻辑。
错误也可能在这里:
sharedPrefSettings = PreferenceManager.getDefaultSharedPreferences(this);
getDefaultSharedPreferences()
有潜在的危险,你应该避免使用它,而是明确地创建你的SharedPreferences
:
sharedPrefSettings = getSharedPreferences("settings", MODE_PRIVATE);
所以当最后修复所有错误时,你的代码应如下所示:
sharedPrefSettings = getSharedPreferences("settings", MODE_PRIVATE);
switch (sharedPrefSettings.getInt(SettingsActivity.KEY_PREF_SCREEN_ORIENTATION, -1)) {
case 1:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case 2:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
default:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
break;
}