平板电脑强制使用横向模式,手机强制使用纵向模式



我一直在开发一个广播应用程序,在此过程中,我决定强制平板电脑仅显示横向模式,手机仅显示纵向模式。 以下是我迄今为止为实现这一目标所做的工作。

首先,我在res.values中放置了一个布尔资源来检查屏幕尺寸。

//  From my res/values/bool.xml(sw600 and 720)dp.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="landscape_only">true</bool>
</resources>
// res/values/bool.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">true</bool>
</resources>

然后,我通过检查 Main Activity 中的布尔值,用代码强制请求的屏幕方向。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// locking out landscape screen orientation for mobiles
if(getResources().getBoolean(R.bool.portrait_only)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
// locking out portait screen orientation for tablets
if(getResources().getBoolean(R.bool.landscape_only)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
}

到目前为止,这效果很好。现在这就是我遇到的问题。

当我实现我的代码来锁定平板电脑的纵向模式时,我的应用程序在切换到横向之前以纵向启动几秒钟。如何确保它不会首先在纵向开始时?它应该从景观开始。

只需在取消通知之前添加一个空检查。

@Override
protected void onDestroy() {
if(radioService != null){
radioService.cancelNotification();
}
super.onDestroy();
}

为了正确更改方向,您应该在清单中的活动标记中添加以下内容 -

<activity 
android:name="com.ABC"
android:configChanges="keyboardHidden|orientation|screenSize">
</activity>

并确保在设置布局之前致电setRequestedOrientation()

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// locking out landscape screen orientation for mobiles
if(getResources().getBoolean(R.bool.portrait_only)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
// locking out portait screen orientation for tablets
if(getResources().getBoolean(R.bool.landscape_only)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
setContentView(R.layout.activity_main);
}

我终于找到了解决问题的方法。我没有引用我的价值资源文件中的替代屏幕视图。当我编辑我的 bool.xml 资源文件时,如下所示,我得到了预期的结果。

bool.xml (mobile)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">true</bool>
<bool name="landscape_only">false</bool>
</resources>
// bool.xml (sw600dp)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">false</bool>
<bool name="landscape_only">true</bool>
</resources>
// bool.xml (sw720dp)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">false</bool>
<bool name="landscape_only">true</bool>
</resources>

有了这个,我的活动现在根据需要以请求的屏幕方向开始。

最新更新