【问题标题】:Disable landscape orientation for phones but allow for tablets禁用手机横向,但允许平板电脑
【发布时间】:2018-11-08 19:47:15
【问题描述】:

所以普遍的共识是这样的;大多数人在纵向使用手机,而大多数人在横向使用平板电脑。根据哪个活动,当您在手机上旋转到横向时,我的应用程序的布局会变得疯狂,考虑到用户不太可能在此处旋转并且没有理由这样做,因此不值得花时间修复。我知道活动元素中清单中的 ole orientation="portrait" 技巧,但是这会将平板电脑用户锁定为不合适的纵向。我想在平板电脑用户的所有活动中禁用纵向,同时在我为手机用户的大多数活动中禁用横向。我试图通过制作一个 layout-large-land 文件夹而不是 layout-large 文件夹来拉一个快速的文件夹,但这并不能阻止平板电脑上的方向改变。

【问题讨论】:

标签: java android


【解决方案1】:

我猜你可以在onCreate()方法中使用这样的代码:

int screenLayoutSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
if (screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_SMALL || screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
}

并且不要在 xml 中指定任何方向,因此默认情况下它会在两种模式下切换。

【讨论】:

  • 关于这个特定问题有几十个答案,而你的答案是唯一真正有效(并且有意义)的答案。
  • 确实,这比“破解”XML 文件要干净得多。这应该是公认的答案。对我来说效果很好!
  • 请注意,虽然这有效,但您的应用仍然可能暂时以横向显示(似乎在设备在 Activity 暂停和恢复之间旋转到横向时发生),所以如果您'正在执行程序化布局,您需要考虑横向模式下的简短外观。
  • RN 开发人员在这里。有效。我在 MainActivity.java > onCreate 方法中添加了它
【解决方案2】:

-做一件事把它放在 res/values 文件中作为 bools.xml 或其他(文件名在这里无关紧要):

<?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="portrait_only">true</bool>
    </resources>

并将这个放在 res/values-sw600dp 和 res/values-xlarge 中:

  <?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="portrait_only">false</bool>
</resources>

然后在 java 类文件中在 onCreate 方法中写入以下代码:

if(getResources().getBoolean(R.bool.portrait_only)){
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

最小宽度方向超过 600 dp 的设备。 see the below link for the how to add directories and file into android studio project

【讨论】:

    【解决方案3】:

    我的建议是首先找到在运行时通过调用this answer 中解释的资源来了解活动是否在平板电脑中执行的方法。然后按照this answer 中的说明设置方向。

    【讨论】:

      【解决方案4】:

      如果您只使用代码中的setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT),您将在 Android 26+ 上发现有趣的效果。如果启用了系统自动旋转选项并且您将手机横向放置并启动新的活动,它将以横向显示,然后在几秒钟内旋转到纵向。如果在 AndroidManifest 中设置 android:screenOrientation="portrait" 选项,您不会看到这样的效果。但是没有办法为手机和平板电脑的 AndroidManifest 提供不同的轮播选项。

      如果你想在手机上锁定纵向并在平板电脑上解锁自动旋转,有办法解决这个问题。

      在 AndroidManifest 中为项目中的每个 Activity 设置选项 android:screenOrientation="locked"

      <activity android:name=".SomeActivity"
          android:screenOrientation="locked" />
      

      where "locked" – 将方向锁定为其当前旋转,无论是什么。在 API 级别 18 中添加 from Android docs

      然后在父BaseActivity中设置这样的代码

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState)
          int orientation = getResources().getConfiguration().orientation;
          if (isTablet()) {   
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
          } else if(orientation != Configuration.ORIENTATION_PORTRAIT) {   
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
          }
      }
      

      有几种方法可以检测当前设备是否为平板电脑。自己选择isTablet()方法的实现。

      【讨论】:

        猜你喜欢
        • 2012-03-26
        • 2012-03-08
        • 2020-08-29
        • 2014-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        相关资源
        最近更新 更多