我正在寻找一种在Java中确定Android Wear设备屏幕是圆形还是矩形的技术.请注意,这不仅仅是布局; 我的代码实际上需要知道它正在使用哪种形状,因为它们的处理方式不同.
从我在网上的代码示例中可以看出,应该有两种不同的方法 - 但是我无法让它们中的任何一种工作.我将它们包括在这里以消除它们的运行,或者可能的故障排除(如果有人可以看到它们的问题).请不要将我推荐给另一个SO帖子,这些帖子只是重申了我在这里不起作用的解决方案.
请注意,此处的所有代码都在手表上运行.另外,我还在使用Eclipse,FWIW.
我见过的最直接的方法onApplyWindowInsets()是在我的布局中为一个视图添加一个监听器.所以我创建了一个如下所示的监听器:
@Override
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
if (insets.isRound()) {
displayShape = "round";
} else {
displayShape = "rectangular";
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
并使用以下代码将其添加到我的布局的根视图中:
view.setOnApplyWindowInsetsListener(this);
Run Code Online (Sandbox Code Playgroud)
在我的onCreate()方法中.尽管看起来很好 - 但是听众永远不会被调用.我还发现建议说我需要手动调用它,如下:
view.requestApplyInsets();
Run Code Online (Sandbox Code Playgroud)
但这似乎没有任何区别.我已经尝试将它放在不同的视图,不同的生命周期方法等等,但从来没有看到它实际上在我的应用程序中被调用.这是在我的LG G手表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"
/>
Run Code Online (Sandbox Code Playgroud)
并创建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"
/>
Run Code Online (Sandbox Code Playgroud)
和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"
/>
Run Code Online (Sandbox Code Playgroud)
最后,我在我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();
}
});
Run Code Online (Sandbox Code Playgroud)
这是一个很长的路要走,但它应该工作,对吗?没有那么多... displayShape总是被设置为"rectangular",表明它总是rect.xml被使用,即使在圆形模拟器上运行也是如此.[我还没有经过圆形筛选的硬件来尝试它.]
那么有人看到我在这两种方法中出错了吗?或者你能提出第三种方法吗?
Str*_*ing 13
经过几天追逐虚假线索,我终于找到了答案.事实证明,它是android:theme清单中的应用程序的差异.
为了WatchViewStub使用正确的矩形/圆形布局,您的应用程序似乎必须将@android:style/Theme.DeviceDefault其用作主题.这是一个例子:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.DeviceDefault">
Run Code Online (Sandbox Code Playgroud)
我希望如果你使用了一个继承自的主题,它也会有用DeviceDefault,虽然我还没有测试过.但似乎如果您使用任何其他自定义主题,WatchViewStub将无法正常运行.
@WaynePiekarski,如果在某处记录下来会很好.
此外,这里还有一些我在学习过程中学到的其他技巧:
矩形布局在圆形布局之前总是膨胀; IOW,在圆形设备上,你会得到两个onLayoutInflated()回调.如果你使用布局膨胀来将屏幕形状变成你的Java代码,那就太麻烦了,结果证明这是必要的,因为......
调用setOnApplyWindowInsetsListener()上WatchViewStub防止轮布局从根本上加载(至少在我的测试).因此,如果您尝试使用此回调来确定屏幕形状,则圆形设备仍将获得方形布局.
最后,一个额外的问题:Android Wear是否有任何理由不仅仅将其屏幕形状报告为资源限定符?你知道,喜欢-land,-large等等.为什么我们真的需要搞砸WatchViewStub?
| 归档时间: |
|
| 查看次数: |
3090 次 |
| 最近记录: |