Android Wear プロジェクトに onApplyWindowInsets コールバックを実装しました。このメソッドでは、 isRound() を呼び出して、コードが円形または長方形の Wear スマートウォッチで実行されているかどうかを判断します。このコールバックはラウンド ウェア エミュレーターから呼び出されます。(isRound() は false を返しますが、これは間違っています。) しかし問題は、onApplyWindowInsets コールバックが Samsung Gear Live から呼び出されないことです。したがって、onApplyWindowInsets からビューを膨張させている場合、ビューは膨張しません。実際のデバイスで onApplyWindowInsets を起動した人はいますか? 保証されていないようです。もしそうなら、スクリーンタイプに応じて異なるビューをどのように膨らませることができますか?
4 に答える
レイアウトでは、円形/長方形の画面に特定の「サブ」レイアウトを設定できます。
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.wearable.view.WatchViewStub
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/stub"
app:rectLayout="@layout/rect_layout"
app:roundLayout="@layout/round_layout"/>
</FrameLayout>
rect_layout と round_layout に異なる ID を使用する場合は、次のように onCreate で確認できます。
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.main_activity);
WatchViewStub stub = (WatchViewStub) findViewById(R.id.stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
mRectBackground = (RelativeLayout) findViewById(R.id.rect_layout);
mRoundBackground = (RelativeLayout) findViewById(R.id.round_layout);
}
});
}
mRectBackground または mRoundBackground のいずれかが非 null になります。両方ではありません。ドキュメントはこちら: https://developer.android.com/training/wearables/apps/layouts.html#UiLibrary
https://github.com/xamarin/monodroid-samples/blob/master/wear/GridViewPager/GridViewPager/MainActivity.csに示すように、他の人は setOnApplyWindowInsetsListener を使用する戦略を使用しようとします。私にはうまくいきませんでした。
onApplyWindowInsets
実際には、開発者はリスナー内でWatchViewStub
'sメソッドを呼び出す必要があります。onApplyWindowInsets
例えば:
WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
@Override
public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {
//////////////////////////////////////////////////
// IMPORTANT - the following line is required
stub.onApplyWindowInsets(windowInsets);
// Set the instance variable to say whether this is round...
mIsRound = windowInsets.isRound();
return windowInsets;
}
});
一見直感的ではないかもしれませんが、これにより、開発者は必要にonApplyWindowInsets
応じてデフォルトの実装をオーバーライドできます。
ドキュメントにはView.OnApplyWindowInsetsListener
次のように記載されています。
非公式な方法 (WatchViewStub を使用しない) - しかし、私にとってはずっと簡単でした。 https://github.com/tajchert/ShapeWear
ShapeWear.java クラスをコピーし、画面の形状検出イベントにサブスクライブするsetOnShapeChangeListener()
か、メソッドを呼び出しShapeWear.isRound()
ます (形状がまだ決定されていない場合にエラーがスローされるShapeWear. getShape()
可能性があります) または -ShapeWear.SHAPE_UNSURE
同じ状況が発生する可能性があります。