Есть ли способ определить, круглые ли часы?

Может быть, я что-то пропустил, но есть ли какой-нибудь флаг для того, чтобы узнать, круглые или квадратные часы?

Я мог представить, что это важно, если вы хотите создать фон уведомлений.

Ответы

Ответ 1

Обновление для API 23:

Чтобы определить, является ли экран круглым, вы можете использовать

context.getResources().getConfiguration().isScreenRound()

ссылка для Android

Или вы можете использовать квалификаторы ресурсов round и notround и позволить системе применять соответствующие ресурсы, но будьте осторожны, что это не будет работать на устройствах с API 22 или ниже

Источник

Спасибо, кто указал на это изменение.

Старый asnwer

Из разговора в режиме ввода-вывода google (https://www.youtube.com/watch?v=naf_WbtFAlY#t=284):

Из класса SDK 20 android.view.View имеет

public void setOnApplyWindowInsetsListener(OnApplyWindowInsetsListener listener)

и OnApplyWindowInsetsListener имеет метод обратного вызова onApplyWindowsInset

public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets){

    if (windowInsets.isRound()){
        //Do stuff
    }

}

Ответ 2

Вероятно, вы захотите использовать WatchViewStub, который включен в библиотеку носимых носителей. В заглушке вы указываете roundLayout и rectLayout, и правильный будет автоматически накачиваться в зависимости от формы экрана пользователя. См. Пример приложения WatchViewStub, который включен в SDK для примера того, как это сделать.

EDIT: Исходный код для загружаемых образцов теперь онлайн. В этом случае взгляните на образец WatchViewStub, который "демонстрирует, как указывать разные макеты для круглых и прямоугольных экранов": https://developer.android.com/samples/WatchViewStub/project.html

Краткий справочник:

В макете:

    <android.blah.WatchViewStub
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:rectLayout="@layout/rect"
        app:roundLayout="@layout/round" />

где прямые и круглые - разные макеты для прямоугольных и круглых дисплеев.

В Управлении:

setContentView(R.layout.main);
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
    @Override
    public void onLayoutInflated(WatchViewStub stub) {
        mTextView = (TextView) stub.findViewById(R.id.text);
        Log.d(TAG, "TextView: " + mTextView.getText() + " view=" + mTextView);
    }
});

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

Ответ 3

Начиная с API 23 вы можете использовать квалификаторы ресурсов -round и -notround. Поэтому в течение нескольких недель нет необходимости использовать WatchViewStub.

В качестве небольшого примера возьмите эти макеты:

layout-round/example.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/round_string"/>

layout-notround/example.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/square_string"/>

Вы также можете использовать только одну строку:

layout/example.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/string"/>

values-round/strings.xml

<resources>
    <string name="string">I am round</string>
</resources>

values-notround/strings.xml

<resources>
    <string name="string">I am square</string>
</resources>

источник

Ответ 4

В моих устройствах сбой оконных окон не прошел, поэтому я сделал небольшой трюк, уродливый, но функциональный.
Если вам нужно проверить внутри своей активности, добавьте в свой макет скрытое текстовое представление со значением "1" в круглом макете и "0" в прямоугольном макете.

<TextView
    android:id="@+id/isRound"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="gone"
    android:text="1" />

Затем в действии:

TextView isRoundText = (TextView) view.findViewById(R.id.isRound);
boolean isRound = "1".equals(isRoundText.getText());

Ответ 5

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

Почему? Во-первых, два решения, открытые @IonSpin, отлично работают, но для первого требуется минимальный SDK 23, а другой - асинхронный...

Используя квалификаторы -round и -notround, просто добавьте фиктивный пустой вид в свой XML-макет Activity, который находится внутри папки layout-round следующим образом:

<View
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:id="@+id/isRound"/>

Затем в вашей деятельности onCreate() просто выполните:

Log.d(TAG, "is not round ? " + (findViewById(R.id.isRound) == null));

И он должен печатать на квадратном smartwatch:

MainActivity: не раунд? правда

Как новый разработчик Android Wear, я нахожу это решение немного невероятным, но он работает с моим Sony SmartWatch 3 и на виртуальном устройстве Android Wear.

Единственным недостатком/компромиссом здесь является то, что вам нужно разместить фиктивный вид во всех своих макетах...

Можете ли вы, ребята, подтвердить, что это работает и для вас?

Ответ 6

Если я правильно понял, он будет использовать стандартные ресурсы Android, то есть вы можете просто разместить свой макет в макете, и все готово.