以编程方式确定 Android Wear 中的屏幕形状

2024-03-20

我正在寻找一种技术来确定 Java 中 Android Wear 设备屏幕是圆形还是矩形。请注意,这不仅仅涉及布局;还涉及布局。我的代码实际上需要知道它正在使用哪种形状,因为它们的处理方式不同。

据我从在线代码示例中看到,两种不同的方法应该是可能的 - 但我一直无法让它们中的任何一个工作。我将它们放在这里是为了将它们从运行中消除,或者进行可能的故障排除(如果有人可以看到它们的问题)。请不要让我参考另一篇仅重申此处对我不起作用的解决方案的帖子。

请注意,此处的所有代码都在手表上运行。另外,我仍在使用 Eclipse,FWIW。

我见过的最简单的方法是添加一个onApplyWindowInsets()侦听我的布局中的视图。所以我创建了一个如下所示的侦听器:

@Override
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
    if (insets.isRound()) {
     displayShape = "round";
    } else {
     displayShape = "rectangular";
    }
    return null;
}

并将其添加到我的布局的根视图中,代码如下:

view.setOnApplyWindowInsetsListener(this);

在我的 onCreate() 方法中。就目前而言看起来还不错——但是监听者永远不会被调用。我还发现建议说我需要手动调用它,如下所示:

view.requestApplyInsets();

但这似乎没有任何区别。我尝试过将其放在不同的视图、不同的生命周期方法等中,但从未见过它在我的应用程序中实际被调用。顺便说一句,这是在我的 LG G Watch 上运行的。

第二种方法是一种黑客方法,基于已发布的WatchViewStub助手类。我费尽心思将可穿戴支持库导入到 Eclipse 项目中,然后将以下内容添加到我的根布局中:

<android.support.wearable.view.WatchViewStub 
    android:id="@+id/watch_view_stub"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:rectLayout="@layout/rect"
    app:roundLayout="@layout/round"
    />

并创造了rect.xml像这样:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:id="@+id/layout_type"
    android:text="rectangular"
    />

and round.xml像这样:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:id="@+id/layout_type"
    android:text="round"
    />

最后,在我的onCreate()我添加了以下 Java 代码:

    final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            TextView layoutType = (TextView) findViewById(R.id.layout_type);
            displayShape = layoutType.getText().toString();
        }
    });

虽然距离街区很远,但应该可以用,对吗?没那么多...displayShape始终设置为"rectangular",表明它总是rect.xml即使在圆形模拟器上运行,也会被使用。 [我还没有圆屏硬件来尝试。]

那么有人看出我这两种方法哪里出了问题吗?或者你能建议第三种实际有效的方法吗?


经过几天的寻找虚假线索,我终于找到了答案。事实证明,这是android:theme清单中产生差异的应用程序的名称。

为了WatchViewStub要使用正确的矩形/圆形布局,您的应用程序似乎must use @android:style/Theme.DeviceDefault作为它的主题。这是一个例子:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.DeviceDefault">

我希望如果您使用继承自的主题,它也会起作用DeviceDefault,虽然我还没有测试过。但似乎如果您使用任何其他自定义主题,WatchViewStub将无法正常工作。

@WaynePiekarski,如果这被记录在某处就好了。

另外,这里还有我在此过程中学到的其他一些技巧:

  1. 矩形布局总是先于圆形布局膨胀; IOW,在圆形设备上,你会得到两个onLayoutInflated()回调。如果您使用布局膨胀将屏幕形状放入 Java 代码中,这有点痛苦,而事实证明这是必要的,因为......

  2. Calling setOnApplyWindowInsetsListener() on WatchViewStub完全阻止圆形布局加载(至少在我的测试中)。因此,如果您尝试使用此回调来确定屏幕形状,圆形设备仍将获得方形布局。

最后,还有一个额外的问题:Android Wear 不只是将其屏幕形状报告为资源限定符,有什么充分的理由吗?你知道,就像-land, -large, 等等。到底为什么我们需要乱搞WatchViewStub根本吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式确定 Android Wear 中的屏幕形状 的相关文章

随机推荐

  • 如何在MySQL和Java中转义引号“”字符

    我们怎样才能逃脱quotes Java 和 MySQL 中的字符 传入的 XML 文件带有引号 我正在使用 Java 解析该文件 所以我想在这里转义引号 但在数据库中它应该包含引号 当我进行查询时 结果会有引号 在网页上显示时 它还应该显示
  • JavaScript 对象类型和基本类型有什么区别?

    Stoyan Stefanov 在他的优秀著作 面向对象的 JavaScript 中说道 任何不属于上面列出的五种基本类型之一的值都是对象 对于五种原始类型 他的意思是Number String Boolean Undefined and
  • Ajax 回调中的设置状态抛出错误:警告:setState(...):只能更新已安装或正在安装

    我有一个相当简单的反应容器组件 它尝试在从 componentDidMount 调用的 ajax 回调中调用设置状态 完整的错误是 警告 setState 只能更新已安装或正在安装的组件 这通常意味着您在未安装的组件上调用了 setStat
  • 摆脱打开 EL 表达式时生成的愚蠢的空间日食

    当我在 Eclipse 中使用 EL 表达式时 我自然会先输入 Eclipse 想帮忙一点 放置了一个右括号 之后 然而 它们之间有一个空间 所以如果我想要 user name I type 其次是user name但我的最终结果是 use
  • 关闭子进程中打开的套接字

    我有一个 SIP 服务器 守护进程 它正在侦听 tcp 套接字 5060 现在 在这个父进程中 我创建一个子进程并在子进程中执行一些操作 现在 当我在父进程中关闭此 tcp 套接字并尝试再次创建 假设我在此服务器上禁用和启用 SIP 时 会
  • 尽管其中一项任务失败,Gradle 返回退出代码为 0

    假设我运行 gradle 任务如下 gradlew cleanTest task1 task2 info rerun task 在这里 如果任务 1 失败而任务 2 通过 则此运行的退出代码仍然为 0 如果任何任务失败 我希望它返回非零 这
  • PasswordResetsController#update 中的 ActiveModel::ForbiddenAttributesError

    我看过 Ryan 铁路广播第 274 集 我正在使用 Rails 4 并遇到一个问题 在password resets controller rb中 elsif user update attributes params user 在控制台
  • 触摸屏设备上的 HTML5 拖放 API

    我只是想知道用于拖放的 HTML5 API 是否包含对触摸屏显示的支持 我正在考虑 iPhone 但我知道它还不支持 我想知道苹果是否正在追赶 以支持 Safari 移动设备上的 HTML5 拖放 但我也想也许 HTML5 API 对此不够
  • 不使用 HQL 检索表的所有行?

    我正在使用 Hibernate 4 并且想简单地列出表的所有行 我发现的所有解决方案都建议使用 from tablename 之类的内容 但我想避免在字符串中硬编码表名 您可以使用 session createCriteria MyEnti
  • 如何让FlashDevelop使用32位JRE?

    我需要为 Android Studio 安装 64 位 JDK 这也意味着JAVA HOME设置为 64 位 JDK 我还安装了 32 位 JRE 和 Flex SDKjvm config文件我指定了它的路径 我知道 Flex SDK 使用
  • 声明FigureCanvasTkAgg导致内存泄漏

    我很难弄清楚为什么FigureCanvasTkAgg 的声明会导致内存泄漏 我的类中有以下几行 init method pndwinBottom is a paned window of the main screen self drawp
  • 获取存在多个相同值的行[重复]

    这个问题在这里已经有答案了 我有一个 R 数据框 看起来像这样 A B C 14 apple 45 14 bannaa 23 15 car 234 16 door 12 16 ear 325 正如您所看到的 14 和 16 是重复的 我想
  • 通用 DataRow 扩展

    我使用扩展方法来检查 DataRowField 是否为 null public static string GetValue this System Data DataRow Row string Column if Row Column
  • 如何使用 Dapper 扩展谓词实现“NOT IN”子句?

    我找到了如何实施IN使用 Dapper 扩展的子句here https stackoverflow com questions 49777139 how to implement in clause with dapper extensio
  • 临时 ASP.NET 文件丢失

    在我的asp项目中运行时抛出错误 昨天效果很好 但今天早上它自己给出了以下消息 Could not load file or assembly file C Windows Microsoft NET Framework v4 0 3031
  • 如何在单个事务下执行多个操作

    我有一个场景 需要将记录添加到表中 然后 如果添加了记录 则在云上创建资源 如果在云上创建资源 则使用资源标识符更新表中的记录 所以 它们是 3 个操作 当其中任何一个操作不成功时 我想恢复所有操作 我们一次性拥有用于多个数据库操作的 Tr
  • 如何调试我的 JavaScript 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当我发现我的代码片段有问题时 我应该如何调试它 Firebug http en wikipedia org wiki Firebug
  • jQuery/css/html:具有固定标题的可滚动表格[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个问题已经被问过好几次了 但我还找不到令人满意的 x 浏览器解决方案 我认为完成具有固定标题的可滚动表格的最简单方法应该是使用
  • SLF4J - 什么是悬挂或分离标记?

    在 SLF4J 中我不完全确定什么是分离标记 http www slf4j org apidocs org slf4j IMarkerFactory html getDetachedMarker 28java lang String 29是
  • 以编程方式确定 Android Wear 中的屏幕形状

    我正在寻找一种技术来确定 Java 中 Android Wear 设备屏幕是圆形还是矩形 请注意 这不仅仅涉及布局 还涉及布局 我的代码实际上需要知道它正在使用哪种形状 因为它们的处理方式不同 据我从在线代码示例中看到 两种不同的方法应该是