2

Android Wear プロジェクトに onApplyWindowInsets コールバックを実装しました。このメソッドでは、 isRound() を呼び出して、コードが円形または長方形の Wear スマートウォッチで実行されているかどうかを判断します。このコールバックはラウンド ウェア エミュレーターから呼び出されます。(isRound() は false を返しますが、これは間違っています。) しかし問題は、onApplyWindowInsets コールバックが Samsung Gear Live から呼び出されないことです。したがって、onApplyWindowInsets からビューを膨張させている場合、ビューは膨張しません。実際のデバイスで onApplyWindowInsets を起動した人はいますか? 保証されていないようです。もしそうなら、スクリーンタイプに応じて異なるビューをどのように膨らませることができますか?

4

4 に答える 4

2

レイアウトでは、円形/長方形の画面に特定の「サブ」レイアウトを設定できます。

 <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 を使用する戦略を使用しようとします。私にはうまくいきませんでした。

于 2014-08-29T16:43:18.713 に答える
2

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のように記載されています

于 2014-10-09T14:41:00.877 に答える
0

非公式な方法 (WatchViewStub を使用しない) - しかし、私にとってはずっと簡単でした。 https://github.com/tajchert/ShapeWear

ShapeWear.java クラスをコピーし、画面の形状検出イベントにサブスクライブするsetOnShapeChangeListener()か、メソッドを呼び出しShapeWear.isRound()ます (形状がまだ決定されていない場合にエラーがスローされるShapeWear. getShape()可能性があります) または -ShapeWear.SHAPE_UNSURE同じ状況が発生する可能性があります。

于 2015-02-16T14:18:10.907 に答える