Android Wear 应用在​​圆形手表上显示矩形布局

Android wear app displaying rect layout on round watch

我有一个 Android Wear 应用程序,但是当我 运行 它在圆形手表 (Moto 360) 上显示时,显示的不是圆形布局,而是矩形布局。

当创建一个新的 wear 项目时,Android Studio 会创建所有必要的布局文件,使其能够自动加载矩形布局我们的圆形布局,除了内容我没有改变矩形或圆形布局文件本身。特别是 我没有更改 activity_main.xml,也没有更改 rect 或 round 活动的名称,也没有更改 activity.

中的加载方式。

这里是activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.wearable.view.WatchViewStub
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/watch_view_stub"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:rectLayout="@layout/rect_activity_main"
    app:roundLayout="@layout/round_activity_main"
    tools:context=".MainActivity"
    tools:deviceIds="wear"></android.support.wearable.view.WatchViewStub>

这是回合的开始_activity_main.xml,没有必要全部展示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context=".MainActivity" tools:deviceIds="wear_round">

    <RelativeLayout
        android:layout_width="fill_parent"

为了完整起见,这里是 rect_activity_main.xml:

的开始
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:orientation="vertical"
    tools:context=".MainActivity" tools:deviceIds="wear_square"
    android:clickable="true">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="60dp"

下面是在 activity 的 onCreate()

中加载布局的方式
   setContentView(R.layout.activity_main);
            WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
            stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener()
            {
                @Override
                public void onLayoutInflated(WatchViewStub stub)
                {
                ...

据我所知,一切都应该如此,就像我提到的那样,因为我没有更改 Android Studio 创建的内容。 有人知道问题出在哪里吗?

首先查看这个答案,我解释了 WindowInsets 是如何交付的:Can you use a WatchViewStub in a GridViewPager for Android Wear?

之后:

  1. 您是在 Activity 中使用它吗?

  2. 你有设置 OnApplyWindowInsetsListener 吗?

  3. 尝试在 onCreate 中调用 stub.requestApplyInsets()。

编辑:

来自评论中的讨论和进一步调查。您似乎需要在主题上设置 <item name="windowOverscan">true</item>,以便 WindowInsets 发送到您的视图。

如果你想要一个简单的解决方案而不需要 WindowInsets 的硬方法,你应该看看这个库:https://github.com/tajchert/ShapeWear 只需调用 ShapeWear.initShapeWear(this); 一次即可初始化,就是这样 - 只需随时调用 getShape()