我希望平板电脑能够以纵向和横向(sw600dp或更大)的方式显示,但手机仅限于纵向。我找不到任何有条件地选择方向的方法。有什么建议吗?
我希望平板电脑能够以纵向和横向(sw600dp或更大)的方式显示,但手机仅限于纵向。我找不到任何有条件地选择方向的方法。有什么建议吗?
不幸的是,使用 setRequestedOrientation(...) 方法会导致活动重新启动,因此即使您在 onCreate 方法中调用它,它也将通过活动生命周期,然后会以所请求的方向重新创建相同的活动。因此,在 @Brian Christensen 的回答中,您应该考虑可能会调用活动代码两次,这可能会产生不良影响(不仅在视觉上,还包括网络请求、分析等方面)。
此外,在清单中设置 configChanges 属性,我认为是一个巨大的权衡,可能需要大量重构成本。Android Devs 不建议更改该属性。
最后,试图以某种不同的方式设置 screenOrientation(以避免重新启动问题)是不可能的,静态上不可能由于不能更改静态清单,在已经启动的活动中编程上只有调用该方法才是可能的。
总结:在我看来,@Brian Christensen 的建议是最好的权衡,但要注意正在重新启动的活动问题。
我将这段代码添加到MainActivity.java
文件中。对于我的情况,它起作用了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handleOrientationConfiguration();
}
private void handleOrientationConfiguration() {
if (isTablet()) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
private boolean isTablet() {
Configuration configuration = this.getContext().getResources()
.getConfiguration();/*from www .j ava 2 s. c o m*/
return (configuration.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
我知道这是一个老问题。为了使您的应用程序始终在纵向模式下运行,即使方向可能已经或已经交换等(例如在平板电脑上),我设计了这个函数,用于设置设备的正确方向,而无需知道设备上如何组织纵向和横向功能。
private void initActivityScreenOrientPortrait()
{
// Avoid screen rotations (use the manifests android:screenOrientation setting)
// Set this to nosensor or potrait
// Set window fullscreen
this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
DisplayMetrics metrics = new DisplayMetrics();
this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
// Test if it is VISUAL in portrait mode by simply checking it's size
boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels );
if( !bIsVisualPortrait )
{
// Swap the orientation to match the VISUAL portrait mode
if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
{ this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
}
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }
}
非常好用!
注意:
将this.activity
更改为您的活动或将其添加到主活动并删除this.activity
;-)
如果您想要相反的效果,则必须将代码更改为横向(但我认为如何做这一点很清楚)。
android:screenOrientation="fullSensor"
并在 layout-land
文件夹下创建 XML 文件
android:screenOrientation="locked"
设置给Activity。val configuration = resources.configuration
val smallestScreenWidthDp = configuration.smallestScreenWidthDp
if (smallestScreenWidthDp>=600){
// for tablet
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
// for phone
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
res
文件夹中使用layout-land
。 - GhostsetRequestedOrientation
一样重新创建Activity:https://dev59.com/questions/A4Xca4cB1Zd3GeqPGlKN#27015879 - guness