Есть ли способ определить, круглые ли часы?
Может быть, я что-то пропустил, но есть ли какой-нибудь флаг для того, чтобы узнать, круглые или квадратные часы?
Я мог представить, что это важно, если вы хотите создать фон уведомлений.
Ответы
Ответ 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, то есть вы можете просто разместить свой макет в макете, и все готово.