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?
之后:
您是在 Activity 中使用它吗?
你有设置 OnApplyWindowInsetsListener 吗?
尝试在 onCreate 中调用 stub.requestApplyInsets()。
编辑:
来自评论中的讨论和进一步调查。您似乎需要在主题上设置 <item name="windowOverscan">true</item>
,以便 WindowInsets
发送到您的视图。
如果你想要一个简单的解决方案而不需要 WindowInsets
的硬方法,你应该看看这个库:https://github.com/tajchert/ShapeWear
只需调用 ShapeWear.initShapeWear(this);
一次即可初始化,就是这样 - 只需随时调用 getShape()
。
我有一个 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?
之后:
您是在 Activity 中使用它吗?
你有设置 OnApplyWindowInsetsListener 吗?
尝试在 onCreate 中调用 stub.requestApplyInsets()。
编辑:
来自评论中的讨论和进一步调查。您似乎需要在主题上设置 <item name="windowOverscan">true</item>
,以便 WindowInsets
发送到您的视图。
如果你想要一个简单的解决方案而不需要 WindowInsets
的硬方法,你应该看看这个库:https://github.com/tajchert/ShapeWear
只需调用 ShapeWear.initShapeWear(this);
一次即可初始化,就是这样 - 只需随时调用 getShape()
。