获取手机方向,但将屏幕方向固定为纵向

2024-04-08

我想要获得手机方向,但将屏幕方向保持为纵向。 因此,无论用户将手机转向横向还是纵向,视图都保持不变,但我可以知道它是转向横向还是纵向。

将活动设置为android:screenOrientation="肖像"将解决这两个问题,但我无法通过以下方式检测手机方向

public void onConfigurationChanged(Configuration newConfig) {
    switch (newConfig.orientation) {
    case Configuration.ORIENTATION_PORTRAIT:
        Toast.makeText(this, "Portrait", Toast.LENGTH_SHORT).show();
        break;
    case Configuration.ORIENTATION_LANDSCAPE:
        Toast.makeText(this, "Landscape", Toast.LENGTH_SHORT).show();
        break;
    default:
        break;
    }
}

有谁知道如何解决这个问题?


这是一个多用途类,用于轻松管理屏幕方向更改:

public class OrientationManager extends OrientationEventListener {

    public enum ScreenOrientation {
        REVERSED_LANDSCAPE, LANDSCAPE, PORTRAIT, REVERSED_PORTRAIT
    }

    public ScreenOrientation screenOrientation; 
    private OrientationListener listener;

    public OrientationManager(Context context, int rate, OrientationListener listener) {
        super(context, rate);
        setListener(listener);
    }

    public OrientationManager(Context context, int rate) {
        super(context, rate);
    }

    public OrientationManager(Context context) {
        super(context);
    }

    @Override
    public void onOrientationChanged(int orientation) {
        if (orientation == -1){
            return;
        }
        ScreenOrientation newOrientation;
        if (orientation >= 60 && orientation <= 140){
            newOrientation = ScreenOrientation.REVERSED_LANDSCAPE;
        } else if (orientation >= 140 && orientation <= 220) {
            newOrientation = ScreenOrientation.REVERSED_PORTRAIT;
        } else if (orientation >= 220 && orientation <= 300) {
            newOrientation = ScreenOrientation.LANDSCAPE;
        } else {
            newOrientation = ScreenOrientation.PORTRAIT;                    
        }
        if(newOrientation != screenOrientation){
            screenOrientation = newOrientation;
            if(listener != null){
                listener.onOrientationChange(screenOrientation);
            }           
        }
    }

    public void setListener(OrientationListener listener){
        this.listener = listener;
    }

    public ScreenOrientation getScreenOrientation(){
        return screenOrientation;
    }

    public interface OrientationListener {

        public void onOrientationChange(ScreenOrientation screenOrientation);
    }
}

这是更简单、可重用的方式,并且您还可以获得 REVERSE_LANDSCAPE 和 REVERSE_PORTRAIT 方向。

您必须实现 OrientationListener,以便仅在发生方向更改时收到通知。

不要忘记调用orientationManager.enable()来开始方向跟踪,然后调用orientationManager.disable()(这两个方法继承自OrientationEventListener类)

更新:用例示例

MyFragment extends Fragment implements OrientationListener {

    ...

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        orientationManager = new OrientationManager(getActivity(), SensorManager.SENSOR_DELAY_NORMAL, this);
        orientationManager.enable();        
    }

    @Override
    public void onOrientationChange(ScreenOrientation screenOrientation) {
        switch(screenOrientation){
            case PORTRAIT:
            case REVERSED_PORTRAIT:
                MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;
            case REVERSED_LANDSCAPE:
                MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            break;
            case LANDSCAPE:
                MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            break;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取手机方向,但将屏幕方向固定为纵向 的相关文章

  • 在 Android 中创建和使用 9 补丁图像

    我最近听说了 9 补丁图像 我知道它是 9 平铺的并且是可拉伸的 我想了解更多 如何创建 9 块图像 有什么工具吗 我可以通过 AndroidSDK 或代码创建它吗 9 patch 相对于普通 png 的主要优点 它是否可以根据屏幕动态 自
  • 单击 RecyclerView 内的 ImageView 时更改图像资源

    每当我单击它时 单击图像 而不是项目 我都会尝试更改回收器视图内特定位置的设备图像资源 我尝试将 setOnClickListener 放入 onBindViewHolder 方法中 但只有最后一个项目受到影响 这是我的回收者视图 http
  • 定期运行任务(每天一次/每周一次)

    我想定期 每周 每天一次 运行一些任务 即获取我的网站新闻页面 即使我的应用程序已关闭 是否可以 是的 您需要查看报警管理器 http developer android com reference android app AlarmMan
  • 显示警报或收到通知时的视图

    我正在关注this http tokudu com 2010 how to implement push notifications for android 显示的教程通知 on an 安卓设备 当我在设备上运行该应用程序时 状态栏上会出现
  • 为什么我将可绘制文件重命名为 .9.png 后出现“Some file crunching failed”?

    我正在测试 9 patch 图像 在一切正常之前 我重命名drawable file ic button beat box default png to ic button beat box default 9 png 然后我收到错误 某些
  • Android Studio:lambda 不起作用[重复]

    这个问题在这里已经有答案了 当尝试使用 lambda 表达式时 我遇到了一些 Gradle 构建错误 错误 41 100 错误 source 1 7 不支持 lambda 表达式 使用 source 8 或更高版本来启用 lambda 表达
  • Android Studio - 错误:未捕获翻译错误:com.android.dx.cf.code.SimException:本地 0001:无效

    我刚刚使用 Android Studio 设置了一台新计算机 并从 bitbucket 导入了我的项目 问题是我现在在尝试构建项目时遇到此错误 信息 Gradle 任务 app clean app generateDebugSources
  • Android Lollipop prepareAsync() 需要很长时间才能返回

    在 Samsung Galaxy Note 4 上的 Android Lollipop 几周前刚刚从 4 4 4 更新 上 prepareAsync 几乎需要 20 秒来加载实时流 在 4 4 4 上 只需要 2 3 秒 并且没有错误 见下
  • React Native Android 发布 apk 是调试,而不是发布

    我有一个现有的 Android 应用程序 我已根据以下内容将 React Native v0 30 活动添加到项目中docs http facebook github io react native releases next docs i
  • 获取可以共享数据的应用程序列表

    此代码显示默认共享对话框 Intent sharingIntent new Intent Intent ACTION SEND sharingIntent setType text html sharingIntent putExtra a
  • 从多个选项卡中的编辑文本字段获取文本

    我正在尝试创建一个使用选项卡作为输入表单的 Android 应用程序 基本上 我希望对其进行设置 以便用户可以在一个选项卡上输入一些信息 然后提交该信息 或者转到另一个选项卡并输入更多信息 然后从两个选项卡提交信息 我正在使用操作栏和片段来
  • 如何在android中的操作栏中创建Edittext?

    我们可以在操作栏中使用编辑文本吗 在阅读了 Google 中的大量资源后 我找不到如何在操作栏中创建编辑文本 谁能告诉我该怎么做 您可以设置自定义View为了ActionBar像这样 getActionBar setCustomView R
  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • 通过列表视图检查动态生成的复选框时遇到问题

    我知道其他成员已经提出了这个问题 一些成员也给出了解决方案 但问题是我没有找到任何适合我的应用程序的解决方案 我正在创建一个应用程序 其中我有一个屏幕 它将显示动态列表视图 其中包含列表项 复选框和三个文本视图 一个用于候选人姓名 另外两个
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • Ionic Facebook Api 无效密钥哈希

    我无法让我的应用程序允许 Facebook 登录 每次用户尝试登录 Facebook 并使用他们的 FB 验证我的应用程序时 都会出现以下错误 无效的密钥哈希 它们的密钥哈希 xxxxxxxxxx 与任何存储的密钥哈希不匹配 配置您的应用程
  • android 中camera.setParameters 失败

    我已将相机功能包含在我的应用程序中 我还在市场上推出了该应用程序 我从一位用户那里收到一条错误消息 称他在打开相机时遇到错误 我已经在 2 1 的设备上测试了该应用程序 我从用户那里得到的错误是使用 Nexus One 它主要运行 2 2
  • 检测 ListView(或 ScrollView)内的滚动位置

    我正在构建一个聊天室应用程序 其中每 X 秒就会轮询一次新事件 每次发生这种情况时 此代码都会使用新数据更新 RoomAdapter ArrayAdapter 的自定义子类 并将其滚动到底部 RoomAdapter adapter Room
  • 在 Android 布局 xml 文件中使用字符串格式参数 [重复]

    这个问题在这里已经有答案了 我在 String xml 文件中定义了一个使用格式参数的字符串 即
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da

随机推荐

  • 允许用户使用下拉菜单更改 CSS 设计元素?

    因此 由于我在为网站确定绝对主题时遇到问题 我想让用户从下拉菜单中选择一个主题 并且当单击某个选项时 它将更改背景图像 背景颜色和背景定位 例如 如果用户选择 Mario Bros 3 主题 他们会得到 background image u
  • Java 中的捕获转换是什么?有人能给我举个例子吗?

    我注意到 JLS 谈到5 1 10 捕捉转换 http java sun com docs books jls third edition html conversions html 5 1 10 但我不明白它们是什么 谁能给我解释一下 举
  • Mysql 或/和优先级?

    我想知道或 和如何工作 例如 如果我想获取 display 1 的所有行 我只能做WHERE tablename display 1 如果我想要显示 1 或 2 的所有行 我只能做WHERE tablename display 1 or t
  • HttpURLConnection 错误:java.net.SocketTimeoutException:连接超时

    我正在使用像这样的简单 urlconnection url URL getClient uid cl id URL url new URL this url Log d Set get t URL url HttpURLConnection
  • Fable F# > js 编译多个.fsx 文件

    如何编译多个 fsx使用寓言的文件 我 天真地 尝试在 fable config 文件中传递它们的数组 如下所示 outDir app projFile app index fsx app testmod fsx sourceMaps tr
  • 无法建立连接 - 源不存在

    我有一个简单的部分 用户可以根据需要从一个元素连接到另一个元素 连接后可以这样 我使用 jsPlumb 进行连接 连接后 如果用户满意可以保存 一切都按照我的要求正确保存 现在当用户重新加载页面连接时 例如 con 6 con 18 不会显
  • 如何改变平滑滚动的速度? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我无法更改平滑滚动的速度 我已经尝试更改以下代码末尾的值 1000 您能帮我吗 document ready funct
  • 从 Airflow Postgres 挂钩检索完整连接 URI

    有没有更简洁的方法从 Postgres 挂钩获取完整的 URI get uri 不包含 额外 参数 所以我像这样附加它们 def pg conn id to uri postgres conn id hook PostgresHook po
  • Flink Logging 获取作业名称或作业 ID

    我正在尝试设置 logback xml 以便它将包含与日志记录关联的 JobName 或 JobId 我还没有找到一种方法来做到这一点 是否可以 最终我想要实现的是能够将日志发送到 ElasticSearch 并用消息标记 JobName
  • 在开发模式下生成 JasperReport 时出错

    我在启动时初始化程序中的报告时遇到问题 前段时间 它工作正常 但是当我将 JDK 1 7 update 17 卸载到 JDK 1 7 update 21 并全新安装 Netbeans 时 存在异常 这是错误消息 Exception in t
  • iOS 应用程序可以在运行时读取自己的权利吗?

    iOS 应用程序可以在运行时发现 检查或以其他方式读取自己的权利吗 理想情况下 我可以将 entitlements 文件的全部 已处理 内容作为 plist 读取 仅获取应用程序标识符前缀将是可接受的次优方案 这里的目标包括 允许使用各种应
  • 创建没有 UI 的 iOS 操作扩展

    我正在尝试创建一个类似于 iOS 中可用的系统 复制 操作的操作扩展 我发现不同的答案说不可能有非全屏用户界面 但根据苹果官方文档 https developer apple com library archive documentatio
  • 树中始终向左|向右的下降路径的最大长度

    我正在准备技术面试 所以基本上从一开始就学习算法 我们得到了 BST 我需要找到其中 desc 路径的最大长度 该路径总是向左或向右 换句话说 示例树的下降路径是2 即15 10 6 5 2 15 10 6 14 我对算法问题非常陌生 解决
  • Predict() glmnet 函数中的错误:尚未实现的方法

    当我使用预测 glmnet 函数时 我收到代码下面提到的错误 mydata lt read csv data csv x lt mydata 1 4 y lt mydata 5 data lt cbind x y model lt mode
  • 如何在Flutter中创建45度的线性渐变?

    我无法理解如何以度数 LinearGradient 进行操作 我有以下代码 Container height 100 0 decoration BoxDecoration borderRadius BorderRadius circular
  • PowerShell 支持常量吗?

    我想在 PowerShell 中声明一些整数常量 有什么好的办法吗 Use Set Variable test Option Constant Value 100 or Set Variable test Option ReadOnly V
  • Visual Studio Code (vscode) - 按键时请求文本文档/文档链接失败错误

    您好 我正在我的 Mac 和 Windows 10 计算机上运行 VSCode 在最新的更新 回滚后 它们都开始显示相同的症状 每按几次按键 就会出现输出框 并在下拉列表中选择 HTML 语言服务器 显示的错误是 Error 13 47 0
  • scala 中 `=> String` 的类型是什么?

    在scala中 有一些按名称调用的参数 def hello who gt String println hello who 参数的类型是什么who 它将 scala REPL 上的函数显示为 hello who gt String Unit
  • 增加 R heatmap() 函数中的行高

    我有一个包含数百行和数十列的矩阵 希望绘制热图 如果我使用本机 R 函数 heatmap matrix sample 1 10000 nrow 1000 ncol 10 我得到一个行标题难以辨认的数字 我假设生成的图像符合当前绘图设备的规格
  • 获取手机方向,但将屏幕方向固定为纵向

    我想要获得手机方向 但将屏幕方向保持为纵向 因此 无论用户将手机转向横向还是纵向 视图都保持不变 但我可以知道它是转向横向还是纵向 将活动设置为android screenOrientation 肖像 将解决这两个问题 但我无法通过以下方式