安卓:平板支持横屏和竖屏,但手机只支持竖屏?

221

我希望平板电脑能够以纵向和横向(sw600dp或更大)的方式显示,但手机仅限于纵向。我找不到任何有条件地选择方向的方法。有什么建议吗?


一种方法是不为手机设计横向布局,即不在res文件夹中使用layout-land - Ghost
13
这只会导致横向布局在横屏模式下显示。它实际上无法防止手机旋转到横屏模式。 - radley
这里有一个仅使用XML的hack解决方案,如果需要更改方向,则不会像setRequestedOrientation一样重新创建Activity:https://dev59.com/questions/A4Xca4cB1Zd3GeqPGlKN#27015879 - guness
15个回答

0

不幸的是,使用 setRequestedOrientation(...) 方法会导致活动重新启动,因此即使您在 onCreate 方法中调用它,它也将通过活动生命周期,然后会以所请求的方向重新创建相同的活动。因此,在 @Brian Christensen 的回答中,您应该考虑可能会调用活动代码两次,这可能会产生不良影响(不仅在视觉上,还包括网络请求、分析等方面)。

此外,在清单中设置 configChanges 属性,我认为是一个巨大的权衡,可能需要大量重构成本。Android Devs 不建议更改该属性

最后,试图以某种不同的方式设置 screenOrientation(以避免重新启动问题)是不可能的,静态上不可能由于不能更改静态清单,在已经启动的活动中编程上只有调用该方法才是可能的。

总结:在我看来,@Brian Christensen 的建议是最好的权衡,但要注意正在重新启动的活动问题。


在清单中使用"screenorientation:”lock“”应该可以解决这个问题。https://dev59.com/Ymkw5IYBdhLWcg3wzd3Z#73893655 - TwiXter

0

我将这段代码添加到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;
        }

如果你只需要这个,那么你应该在你的清单文件中使用android:screenOrientation="nosensor"来设置所有活动的屏幕方向。这就是它的作用。https://dev59.com/Ymkw5IYBdhLWcg3wzd3Z#73893655 - TwiXter
实际上,该代码提供了在平板电脑上启动横向模式,在移动设备上启动纵向模式的功能。当我使用android:screen Orientation="no sensor"时,也许应用程序可以在平板电脑上以纵向屏幕模式启动。这是正确的吗? - ikbalkazanc
通常不需要,它使用“自然”的设备方向。平板电脑的自然方向是横向,而手机的自然方向是纵向。您的代码没问题,但您应该在清单文件的活动中添加android:screenOrientation="locked",否则例如在手机上,如果您处于横向方向,则在执行代码时,您的活动将首先以横向显示,然后重新启动以纵向显示。 - TwiXter
抱歉,无法编辑我的评论:当您使用 “locked” 时,您的新活动将保留先前的活动方向,直到您通过调用代码更改它。 - TwiXter
感谢提供有用的信息。我会在下一个功能中更改代码。毕竟这些都是不必要的 ^^ - ikbalkazanc

0

我知道这是一个老问题。为了使您的应用程序始终在纵向模式下运行,即使方向可能已经或已经交换等(例如在平板电脑上),我设计了这个函数,用于设置设备的正确方向,而无需知道设备上如何组织纵向和横向功能。

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

如果您想要相反的效果,则必须将代码更改为横向(但我认为如何做这一点很清楚)。


现在随着屏幕分辨率的增加,你可能无法区分它是平板还是手机。 - TwiXter
@TwiXter 这不是关于检测它是手机还是平板电脑,而是关于检测真实的方向(对于你的眼睛)。仔细阅读文本。只要没有正方形屏幕,这就是一个完美的解决方案。 - Codebeat
问题是:Android:允许平板电脑横屏和竖屏,但在手机上强制使用竖屏?无论如何,获取方向的最佳解决方案是:context.getResources().getConfiguration().orientation,它将返回ORIENTATION_PORTRAIT/ORIENTATION_LANDSCAPE/ORIENTATION_SQUARE(主要用于手表)或ORIENTATION_UNDEFINED。 - TwiXter
@TwiXter 在问题中:“我找不到任何有条件选择方向的方法。”这就是我的回答。另外,一些平板电脑型号上可以交换纵向和横向显示,这取决于设备上如何实现。这就是为什么我编写了这个函数,以确定用户眼中的真正纵向或横向。我不关心设备报告什么,因为它可能在视觉上是错误的。这种方法从不失败。 - Codebeat

0
在清单文件中,您添加以下代码:
android:screenOrientation="fullSensor"

并在 layout-land 文件夹下创建 XML 文件


0
如果你想在手机上强制使用竖屏,并在平板上允许横屏,按照以下步骤操作:
步骤1: 在AndroidManifest.xml文件中,将android:screenOrientation="locked"设置给Activity。
步骤2: 创建一个平板设备的限定符。
步骤3:
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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接