Определение типа износа Android — круглый или квадратный

Мне любопытно узнать о типе износа, будь то круглый или квадратный, потому что на основе типа устройства я хочу сделать разные виды для круглого и квадратного. Из Этот пост я добрался до знаю, что в классе SDK-20 android.view.View есть новый прослушиватель для определения типа устройства, используя это, я пытаюсь получить тип устройства, но ничего не печатается на logcat. Ниже приведен код, который я пробовал.

public class WearSplash extends Activity implements OnApplyWindowInsetsListener {
private WatchViewStub _stub = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_wear_splash);

    _stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    _stub.setOnApplyWindowInsetsListener(this);
    _stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {

        @Override
        public void onLayoutInflated(WatchViewStub mStub) {
            // here on the basis of device type i want to inflate views.
        }
    });

}
@Override
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
    System.out.println(" in testing phase");
    if (insets.isRound())
        System.out.println("in round");
    else
        System.out.println("in square");
    return null;
  }
}

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"
app:roundLayout="@layout/round"
tools:context="com.app.WearSplash"
tools:deviceIds="wear" >

</android.support.wearable.view.WatchViewStub>

Круглый:

<?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="com.app.WearSplash"
tools:deviceIds="wear_round" >

<TextView
    android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:contentDescription="@string/hello_world" />

</RelativeLayout>

Квадрат:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="com.app.WearSplash"
tools:deviceIds="wear_square" >

<ImageView 
    android:id="@+id/image"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:contentDescription="@string/hello_world"
    android:background="@drawable/ic_launcher"/>

</LinearLayout>

Я новичок в разработке одежды, дайте мне знать, где я ошибаюсь. Руки помощи будут высоко оценены.


person Pankaj Arora    schedule 23.07.2014    source источник
comment
Не уверен, что это проблема, я тоже не пробовал с износом, но когда я попытался реализовать OnApplyWindowInsetsListener в студии Android, он автоматически заполнился как View.OnApplyWindowInsetsListener. Так что, пожалуйста, попробуйте public class WearSplash extends Activity implements View.OnApplyWindowInsetsListener вместо class WearSplash extends Activity implements OnApplyWindowInsetsListener.   -  person Harikrishnan    schedule 23.07.2014
comment
Уже пробовал, не работает   -  person Pankaj Arora    schedule 23.07.2014
comment
На самом деле я получаю сообщение об ошибке, когда пытаюсь реализовать OnApplyWindowInsetsListener без части View..   -  person Harikrishnan    schedule 23.07.2014
comment
Вы пробовали отлаживать? public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) срабатывает?   -  person Harikrishnan    schedule 23.07.2014
comment
да, я отлаживаю, общедоступные WindowInsets onApplyWindowInsets (View v, вставки WindowInsets) никогда не вызываются.   -  person Pankaj Arora    schedule 23.07.2014
comment
У меня нет устройства, и эмулятор у меня плохо работает, поэтому я не могу его протестировать. Можете ли вы попробовать findViewById(android.R.id.content).setOnApplyWindowInsetsListener(this); сразу после setContentView, а затем прокомментировать _stub.setOnApplyWindowInsetsListener(this);, а затем попробовать запустить? Если получится сообщите. :)   -  person Harikrishnan    schedule 23.07.2014
comment
07-23 11:11:30.590: E/AndroidRuntime(1189): java.lang.NullPointerException 07-23 11:11:30.590: E/AndroidRuntime(1189): в android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java: 5436) 07-23 11:11:30.590: E/AndroidRuntime(1189): в android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5439) 07-23 11:11:30.590: E/AndroidRuntime(1189): в android.view.ViewRootImpl.dispatchApplyInsets(ViewRootImpl.java:1170)   -  person Pankaj Arora    schedule 23.07.2014
comment
Давайте продолжим обсуждение в чате.   -  person Harikrishnan    schedule 23.07.2014
comment
извините..чат в моем офисе запрещен.   -  person Pankaj Arora    schedule 23.07.2014
comment
Я просмотрел документацию и обнаружил, что вы можете заставить представление применять вставки окна, используя dispatchApplyWindowInsets(some_Window_insets_Object), следовательно, запуская метод. Почему бы не попробовать?   -  person Harikrishnan    schedule 23.07.2014
comment
можешь написать код?   -  person Pankaj Arora    schedule 23.07.2014
comment
Можете ли вы опубликовать свой файл макета xml?   -  person Maciej Ciemięga    schedule 23.07.2014
comment
@MaciejCiemięga проверьте xml-файлы.   -  person Pankaj Arora    schedule 24.07.2014
comment
@ MaciejCiemięga Я хочу раздуть разные учетные записи просмотра до круглых и квадратных, например, если приложение работает с круглым пользовательским интерфейсом, оно будет отличаться от того, когда приложение работает на квадратной одежде. я надеюсь, что я в состоянии очистить свое требование.   -  person Pankaj Arora    schedule 24.07.2014
comment
@PankajArora: воспользуйтесь решениями, описанными в ответах ниже. От себя еще добавлю, что НЕЛЬЗЯ return null в onApplyWindowInsets методе. Вам НЕОБХОДИМО либо вернуть объект insets (немодифицированный, либо измененный). return null; приведет к NullPointerException.   -  person Maciej Ciemięga    schedule 24.07.2014
comment
Возможный дубликат Есть ли способ определить, часы круглые?   -  person rekire    schedule 14.03.2016


Ответы (4)


Неофициальный способ (без использования WatchViewStub) - но для меня это было намного проще. https://github.com/tajchert/ShapeWear

Просто скопируйте класс ShapeWear.java и подпишитесь на событие обнаружения формы экрана setOnShapeChangeListener() или вызовите метод ShapeWear.isRound() (может выдать ошибку, если форма еще не определена) или ShapeWear. getShape() - что может привести к ShapeWear.SHAPE_UNSURE в той же ситуации.

person Michał Tajchert    schedule 16.02.2015

Представлен API 23:

isScreenRound()

person rmgoncalo    schedule 08.02.2017
comment
Было бы хорошо, если бы этот ответ предоставил больше контекста. Ссылка на ссылку хороша, но для новичков (таких как я) довольно сложно понять, как это можно использовать в коде. - person bartaxyz; 17.04.2021

Используйте WatchViewStub, чтобы раздуть представление. Позже в файле макета вы можете указать макет для каждого типа часов, как показано ниже. Он автоматически выберет правильный макет в соответствии с требованиями устройства.

<android.support.wearable.view.WatchViewStub
    .
    .
    .
    app:rectLayout="@layout/rect_activity_my_wear"
    app:roundLayout="@layout/round_activity_my_wear"
    .
    .
    .
>
person Tapas Behera    schedule 23.07.2014

Если вам нужно получить эту информацию программно, вы правы, добавляя прослушиватель для setOnApplyWindowInsetsListener(). Однако, чтобы вызвать это, вы должны также вызвать requestApplyInsets().

В любом случае, если вы хотите знать это только для переключения между двумя альтернативными макетами, вы можете использовать класс WatchViewStub, который делает это автоматически (docs здесь).

person matiash    schedule 23.07.2014
comment
можете ли вы сказать, как реализовать это в моем коде, чтобы получить тип износа? - person Pankaj Arora; 24.07.2014
comment
Я не думаю, что есть необходимость вызывать requestApplyInsets() вручную. Я успешно вызвал этот слушатель без него. - person Maciej Ciemięga; 24.07.2014
comment
@MaciejCiemięga На WatchViewStub или с другими подклассами View? - person matiash; 24.07.2014
comment
@matiash: В любом представлении — например, FrameLayout, TextView и т. д. - person Maciej Ciemięga; 24.07.2014
comment
@ MaciejCiemięga Я не проверял это на других представлениях, но WatchViewStub вызывает requestApplyInsets() вручную. Моя теория заключается в том, что он запускается один раз при размещении, поэтому, если вы добавите прослушиватель позже, он не будет вызываться снова, если вы не запросите его снова. - person matiash; 24.07.2014
comment
@PankajArora Попробуйте добавить _stub.requestApplyInsets(); после stub.setOnApplyWindowInsetsListener(this); - person matiash; 25.07.2014
comment
@MaciejCiemięga Возможно, вы добавили прослушиватель в новое представление до того, как представление было добавлено в иерархию представлений, но здесь это не так. - person matiash; 25.07.2014
comment
@matiash Я говорю о том же случае, что и в ОП, но с другим видом вместо WatchViewStub. В более короткой форме это будет так: setContentView(R.layout.main_activity); findViewById(R.id.frameLayout).setOnApplyWindowInsetsListener(this); и все работает просто отлично. Обратный вызов onApplyWindowInsets запускается. frameLayout добавлено для просмотра иерархии (конечно, еще не выложено), но это случай из вопроса. - person Maciej Ciemięga; 25.07.2014
comment
ребята, я не понимаю, что, наконец, я должен применить. - person Pankaj Arora; 25.07.2014
comment
@matiash Я уже пробовал то, что ты предложил, ude, но и с этим ничего не происходит. - person Pankaj Arora; 25.07.2014