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

标签 wear-os

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

据我从在线代码示例中所看到的,应该有两种不同的方法-但是我一直无法使它们中的任何一种都起作用。我将在此处包括它们,以从运行中消除它们,或进行可能的故障排除(如果有人可以看到它们的问题)。请不要把我引到另一篇SO帖子上,该帖子只是在这里重申对我不起作用的解决方案。

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

我见过的最直接的方法是在布局中的 View 中添加一个onApplyWindowInsets()监听器。因此,我创建了一个看起来像这样的监听器:

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

并使用以下代码将其添加到布局的根 View 中:
view.setOnApplyWindowInsetsListener(this);

在我的onCreate()方法中。看起来还不错-但是监听器永远不会被调用。我还发现建议说我需要手动调用它,例如:
view.requestApplyInsets();

但这似乎没有任何区别。我已经尝试过将其放在不同的 View ,不同的生命周期方法等中,但是从未见过它在我的应用程序中真正被调用过。它正在我的LG G Watch BTW上运行。

第二种方法有些骇人听闻,它基于已发布的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"
    />

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。 [我还没有可尝试的圆形屏幕硬件。]

那么,有没有人看到这两种方法中我哪里出错了?还是可以建议一种实际可行的第三种方式?

最佳答案

在花了几天的时间寻找错误的线索之后,我终于找到了答案。事实证明,区别在于 list 中的应用程序的android:theme

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

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

我希望如果您使用从DeviceDefault继承的主题也可以使用,尽管我尚未对此进行测试。但是看来,如果您使用任何其他自定义主题,则WatchViewStub将无法正常运行。

@WaynePiekarski,如果在此处记录此内容,那就太好了。

此外,以下是我在此过程中学到的其他一些技巧:
  • 矩形布局总是在圆形布局之前膨胀; IOW,在圆形设备上,您将获得两个onLayoutInflated()回调。如果您使用布局膨胀将屏幕形状转换为Java代码,这会很痛苦,事实证明这是必要的,因为...
  • setOnApplyWindowInsetsListener()上调用WatchViewStub可以完全阻止圆形布局的加载(至少在我的测试中)。因此,如果您尝试使用此回调来确定屏幕形状,则圆形设备仍将获得正方形布局。

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

    关于wear-os - 以编程方式确定Android Wear中的屏幕形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25633446/

    相关文章:

    Android Wear : Only "Simple" watchface is working, 所有其他黑色

    Android Wear DataMap 条目有效期多长时间

    android - 5分钟后全部死亡

    android - 未从 BroadcastReceiver 接收到 WearableListerService 的消息

    android - 如何让 Android 上的音乐播放器按钮像谷歌播放音乐一样佩戴

    安卓工作室 : Execution failed for task ':mobile:handleDebugMicroApk'

    android - 在 openGl android(Wear) 中绘制基于图像的纹理

    Android Wear Preview 应用与我的设备不兼容

    listview - 如何在 WearblListView 中为 topEmptyRegion 设置布局?

    java - 如何在屏幕超时后保持 android wear 应用程序打开