首页 > 解决方案 > 是否可以在不使用单个“样式”属性的情况下设置整个应用程序的样式?

问题描述

我的问题可能很愚蠢,但是否可以通过 theme.xml 设置整个应用程序的样式而不在布局中使用单个样式属性?

例如,我有这个 imageView 并通过 app:style 设置样式:

<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 和 Toolbar 是可能的,但是其他组件呢?

标签: android

解决方案


不适合所有人。在应用程序级别的主题中,您可以设置属性,例如

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

推荐阅读