Android Wear 圆形模拟器充气方形布局

Posted

技术标签:

【中文标题】Android Wear 圆形模拟器充气方形布局【英文标题】:Android Wear Round Emulator inflating Square Layout 【发布时间】:2015-04-29 13:23:16 【问题描述】:

我首先想说的是,我知道这里已经有类似的问题了,但没有一个能解决这个问题

我在 Ubuntu 上使用 Round android Wear Emulator(Android 5.0.1 和 x86)。屏幕显示为圆形,模拟器上的所有其他功能(设置表盘、卡片)都显示为圆形手表。然而,在我的应用程序中,我使用的是 WatchViewStub,尽管我在布局中指定了以下内容,但圆形模拟器正在膨胀方形布局:

app:rectLayout="@layout/rect_activity_setup"
app:roundLayout="@layout/round_activity_setup"

这是我的活动代码:

  @Override
  protected void onCreate(final Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_setup);

    final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() 
      @Override
      public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) 
        stub.onApplyWindowInsets(windowInsets);
        return windowInsets;
      
    );
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() 
      @Override
      public void onLayoutInflated(WatchViewStub stub) 
        // ...
      
    );
  

我还需要做些什么来告诉应用设备是圆形的吗?还是模拟器的BUG?

【问题讨论】:

【参考方案1】:

因此,您可以通过设置自定义视图来实现。假设您要为FrameLayout 充气。你会有两种观点。 RoundFrameLayout.java 和 RectFrameLayout.java。然后让他们都实现以下

public interface RoundAware 
    boolean isRound();

RoundFrameLayout 将如下所示。

public class RoundFrameLayout extends FrameLayout implements RoundAware 
    public RoundFrameLayout(Context context) 
        super(context);
    

    public RoundFrameLayout(Context context, AttributeSet attrs) 
        super(context, attrs);
    

    public RoundFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
    

    public RoundFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) 
        super(context, attrs, defStyleAttr, defStyleRes);
    

    @Override
    public boolean isRound() 
        return true;
    

RectFrameLayout 将如下所示。

public class RectFrameLayout extends FrameLayout implements RoundAware 
    public RoundFrameLayout(Context context) 
        super(context);
    

    public RoundFrameLayout(Context context, AttributeSet attrs) 
        super(context, attrs);
    

    public RoundFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
    

    public RoundFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) 
        super(context, attrs, defStyleAttr, defStyleRes);
    

    @Override
    public boolean isRound() 
        return false;
    

然后将视图存根的圆形和矩形布局正确指向 RoundFrameLayout 和 RectFrameLayout xml 文件。如果您希望它们具有相同的内容,请在每个文件中为所有视图的子项使用包含标记。

【讨论】:

以上是关于Android Wear 圆形模拟器充气方形布局的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Wear 中正确显示通知

方形布局边框与圆形内边缘

具有圆形内边缘的方形布局边框

强制android使用方形启动器图标

Android Wear 布局开始太低

在 Android 中获取布局充气器的正确方法是啥?