#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>