【问题标题】:How to define a custom Application theme to specify a default background for a layout in Android?如何定义自定义应用程序主题以指定 Android 布局的默认背景?
【发布时间】:2014-03-26 20:07:11
【问题描述】:

我正在为我们的 Android 应用程序创建一个默认主题,以指定要应用于整个应用程序的默认自定义主题。我们的想法是我们不必在布局中指定与外观相关的属性,它们应该通过将自定义主题应用于整个应用程序来自动注入。

我可以通过覆盖它们的样式来为 TextViewEditText 等 UI 小部件执行此操作。 例如覆盖android:textViewStyleandroid:buttonStyle等。 如何对布局(LinearLayoutRelativeLayout 等)执行相同操作,以便为布局指定默认背景?

android manifest 中的应用程序元素如下所示:

....
<application android:icon="@drawable/ic_launcher" android:label="@string/app_title"      android:allowBackup="false" 
    android:theme="@style/Theme.MyCustomTheme" android:name="MyAppClass">

Theme.MyCustomTheme 看起来像这样:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
  <style name="Theme.MyCustomTheme" parent="Theme.AppCompat">
  <item name="android:textViewStyle">@style/my_custom_text_view_style</item>
  <item name="android:editTextStyle">@style/my_custom_edit_text_style</item>
  <item name="android:buttonStyle">@style/my_custom_button_style</item>
  <item name="android:listViewStyle">@style/my_custom_list_style</item>

上面的自定义样式继承自各自的android基础样式。

我正在寻找正确的 android 属性以在上面使用来覆盖布局的样式,以便我可以将自定义默认背景应用于布局中声明的每个布局(LinearLayoutRelativeLayout 等)@987654331 @ 文件,而不必在布局 xml 中明确指定它。我尝试覆盖android:colorBackground,但这没有任何区别。我尝试覆盖android:windowBackground,但这也改变了操作栏的颜色。请注意,我使用的是 appcompat 支持库中的 appcompat 主题。

【问题讨论】:

    标签: android android-layout android-theme


    【解决方案1】:

    我终于想出了如何为我的应用程序中的每个容器布局定义自定义默认背景

    1. 首先,我将自定义主题定义为一种样式,其中应用程序兼容背景作为覆盖默认窗口背景的父背景。请注意,我正在使用 Android 兼容性库中的主题来支持预蜂窝 Android 设备

       <style name="Theme.MyCustomAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
      
          <item name="android:windowBackground">@color/my_custom_window_background</item>
          <item name="android:colorBackground">@color/my_custom_window_background</item>
      
      </style>
      
    2. 我将上面的主题应用到了AndroidManifest中的整个应用程序

    3. 上述步骤导致每个窗口都有我在上面的步骤 1 中定义的默认窗口背景颜色,包括操作栏。我绝对不希望我的操作栏、编辑文本、文本视图等成为默认的窗口颜色。所以,我需要回到第 1 步并覆盖我不想拥有默认窗口背景的特定 UI 小部件的样式

        <style name="Theme.MyCustomAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
         <item name="android:windowBackground">@color/my_custom_window_background</item>
         <item name="android:colorBackground">@color/my_custom_window_background</item>
         <item name="android:actionMenuTextColor">@color/customMenuColor</item>
          <item name="android:textViewStyle">@style/customTextViewStyle</item>
          <item name="android:editTextStyle">@style/customEditTextStyle</item>
          <item name="android:buttonStyle">@style/customButtonStyle</item>
          <item name="android:listViewStyle">@style/customListViewStyle</item>
          <item name="android:tabWidgetStyle">@style/customTabWidgetStyle</item>
          <!-- Support library compatibility -->
          <item name="actionBarStyle">@style/customActionBarStyle</item>
          <item name="actionMenuTextColor">@color/customMenuColor</item>
      

    4. 最后一步是定义上面定义的每个自定义样式,要么为其设置自定义样式,要么分配系统默认样式(由于自定义窗口背景而被覆盖)

    例如,自定义操作栏样式如下所示:

    <style name="customActionBarStyle"
               parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
           <item name="android:background">@color/light_black</item>
           <item name="android:displayOptions">showHome|showTitle</item>
           <item name="android:titleTextStyle">@style/customActionBarTitleTextStyle</item>
           <!-- Support library compatibility -->
           <item name="background">@color/light_black</item>
           <item name="displayOptions">showHome|showTitle</item>
           <item name="titleTextStyle">@style/customActionBarTitleTextStyle</item>
      </style> 
    
    1. 这种方法的优点是您可以以集中方式定义默认主题,而不必为每个布局定义背景,因为它将通过应用于整个应用程序的自定义主题注入。任何未来重新- 使用这种方法,应用程序的主题化将非常容易

    请参阅Android Documentation 主题,包括如何为操作栏设置主题以了解更多信息

    【讨论】:

      【解决方案2】:

      查看themes.xml,我没有看到任何适用于布局和ViewGroups 的东西(尽管您可以看到列表和一些小部件的样式支持)。

      因此我不确定是否可以将您的自定义样式应用于所有布局。

      我猜您仍然需要应用您的自定义布局样式,(您可以将背景颜色更改为

      <item name="android:background">#ff0000</item> 
      

      ) 你自己的每个布局。

      随时证明我错了。

      【讨论】:

      • 感谢您的回复。覆盖 android:background 将改变每个 UI 元素的背景,而不仅仅是布局。我已经尝试过了,弄乱了整个用户界面。如果您看到我的自定义样式,它们会覆盖适用于特定元素的样式。我想对线性、相对布局等做同样的事情,但不知道如何覆盖适用于布局的样式(从 ViewGroup 继承的 UI 布局)。
      • @user3465654 我更新了我的答案,我怕你得不到你想要的
      • 覆盖 android:background 不是我的解决方案。这个想法本身就是为每个布局注入背景,而不必为每个布局明确指定它。我会继续研究如何实现这一目标。
      • 如果您在样式中指定背景,然后为每个布局设置样式,则不必为每个布局指定背景。如果您找到替代解决方案,请告诉我。
      • @kiruwkna,如果可能的话,我什至不想为每个布局指定一个样式并希望它自动注入(就像我可以通过在我的主题。看起来一般来说布局/视图组没有等效项。接下来我要尝试的是在我的主题中覆盖 windowBackGround,但这也会改变操作栏的颜色,所以我需要覆盖actionBarStyle 来控制它的背景。我想它需要一些试验和错误。
      猜你喜欢
      • 2023-04-02
      • 2016-10-09
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多