Можно ли стилизовать все приложение без использования одного атрибута «стиль»?

#android

Вопрос:

Мой вопрос может быть глупым, но возможно ли стилизовать все приложение с помощью themes.xml без использования единого атрибута стиля в макетах?

Например, у меня есть этот просмотр изображений и я устанавливаю стиль с помощью приложения:стиль:

 <ImageView
android:id="@ id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:src="@drawable/ic_bottom_sheet_edit" 
app:style="@style/imageViewStyle"/>
 

Можно ли установить такой стиль, как?:

 <style name="MyTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="imageViewStyle">@style/MyTheme.ImageView</item> 
 

Можно ли это сделать для всех компонентов и как я могу определить правильные имена элементов (в случае выше: imageViewStyle), которые я должен установить? Я знаю, что это возможно, по крайней мере, для TabLayout и панели инструментов, но как насчет других компонентов?

Ответ №1:

Не для всех. В темах на уровне приложения вы можете установить такие атрибуты, как

         <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
        <item name="android:textColorPrimary">@color/textColorPrimary</item>
        <item name="android:textColor">@color/white</item>
 

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

 class AppImageView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0,
) : LinearLayout(context, attrs, defStyle) {

 init{
  //inflate layout here with desired style
  //also good practice to have custom attribute set in values/attrs.xml     

  }
}
 

и, наконец, вы можете использовать это представление в макетах, как вы использовали бы представления Android по умолчанию.

 <AppImageView>
 width
height
..
</AppImageView>