当前位置 : 主页 > 手机开发 > android >

Android:程序化“允许重定向”首选项仅适用一次

来源:互联网 收集:自由互联 发布时间:2021-06-11
我有一个带有键“allow_reorientation”的CheckBoxPreference.如果启用,则我的主要活动应在设备旋转时重新定向,如果禁用,则应保持其当前方向.我在manifest.xml中设置了’ android:configChanges =“o
我有一个带有键“allow_reorientation”的CheckBoxPreference.如果启用,则我的主要活动应在设备旋转时重新定向,如果禁用,则应保持其当前方向.我在manifest.xml中设置了’ android:configChanges =“orientation”’,以允许自定义处理方向更改.

从我的主要活动课:

@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’存储在任何地方,所以第二次重新定位回到肖像是将最新的方向值与仍然显示纵向方向的预先存在的值进行比较,因此未检测到配置更改.但是,如果这是真的,那么当我尝试第二次定向到景观时,我在上述方法中设置的断点将被激活,但在这种情况下从不调用该方法.

有人可以澄清一下发生了什么,并提供补救措施吗?

非常感谢.

解决方案 – 谢谢下面的马修威利斯

在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);
        }
    }
}

在YourActivity中扩展Activity:

public void onResume() {
        super.onResume();
        YourApp app = (YourApp)this.getApplication();
        app.updateOrientationConfiguration(this);
    }
另一种方法是使用 ActivityInfo.SCREEN_ORIENTATION_SENSOR和 ActivityInfo.SCREEN_ORIENTATION_NOSENSOR.

您基本上可以根据您的偏好设置其中一个,然后您不必实现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();
    }
}

在测试中,我注意到SCREEN_ORIENTATION_NOSENSOR也会导致旋转到默认方向,因此必须明确使用_LANDSCAPE和_PORTRAIT.

网友评论