如何定义自定义应用程序主题以指定Android中布局的默认背景?

如何定义自定义应用程序主题以指定Android中布局的默认背景?,android,android-layout,android-theme,Android,Android Layout,Android Theme,我正在为Android应用程序创建一个默认主题,以指定应用于整个应用程序的默认自定义主题。我们的想法是,我们不应该在布局中指定与外观相关的属性,而应该通过将自定义主题应用于整个应用程序来自动注入这些属性 我可以通过覆盖它们的样式,为诸如TextView和EditText之类的UI小部件做到这一点。 例如,覆盖android:textViewStyle和android:buttonStyle,等等。 如何对版面(LinearLayout或RelativeLayout等)执行相同操作,以便为版面指定

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

我可以通过覆盖它们的样式,为诸如
TextView
EditText
之类的UI小部件做到这一点。 例如,覆盖
android:textViewStyle
android:buttonStyle
,等等。 如何对版面(
LinearLayout
RelativeLayout
等)执行相同操作,以便为版面指定默认背景

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

....
<application android:icon="@drawable/ic_launcher" android:label="@string/app_title"      android:allowBackup="false" 
    android:theme="@style/Theme.MyCustomTheme" android:name="MyAppClass">
<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>
<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> 
。。。。
Theme.MyCustomTheme看起来像这样:

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

@样式/我的\自定义\文本\视图\样式
@样式/我的\自定义\编辑\文本\样式
@样式/我的\自定义\按钮\样式
@样式/我的\自定义\列表\样式

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

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

查看时,我没有看到任何适用于布局和
视图组的内容(尽管可以看到列表和一些小部件的样式支持)

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

我想你仍然需要应用你的自定义布局风格(你可以根据需要改变背景色)

<item name="android:background">#ff0000</item> 
#ff0000
)你自己的每一个布局


请随意证明我错了。

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

  • 首先,我将自定义主题定义为一种样式,以appcompat背景作为父背景,覆盖默认窗口背景。请注意,我正在使用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>
    
    
    @颜色/我的\自定义\窗口\背景
    @颜色/我的\自定义\窗口\背景
    
  • 我将上述主题应用于AndroidManifest中的整个应用程序

    < 应用程序android:icon=“@drawable/ic_launcher”android:label=“@string/app_title”android:theme=“@style/theme.MyCustomTheme”/>

  • 上述步骤导致每个窗口都具有上面步骤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>
    
    
    @颜色/我的\自定义\窗口\背景
    @颜色/我的\自定义\窗口\背景
    @颜色/自定义颜色
    @样式/自定义文本视图样式
    @样式/自定义编辑文本样式
    @样式/自定义按钮样式
    @样式/自定义列表视图样式
    @样式/自定义选项卡WidgetStyle
    @样式/自定义操作栏样式
    @颜色/自定义颜色
    

  • 最后一步是定义上面定义的每个自定义样式,使其具有自定义样式,或随后指定系统默认样式(由于自定义窗口背景而被覆盖)

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

    ....
    <application android:icon="@drawable/ic_launcher" android:label="@string/app_title"      android:allowBackup="false" 
        android:theme="@style/Theme.MyCustomTheme" android:name="MyAppClass">
    
    <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>
    
    <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> 
    
    
    @颜色/浅黑色
    showHome | showTitle
    @样式/自定义操作BartitletextStyle
    @颜色/浅黑色
    showHome | showTitle
    @样式/自定义操作BartitletextStyle
    
  • 这种方法的优点是,您可以集中定义默认主题,而不必为每个版面定义背景,因为它将通过应用于整个应用程序的自定义主题注入。。使用这种方法,应用程序的任何未来重新主题化都将非常容易

  • 有关更多信息,请参阅主题设置,包括如何设置操作栏主题

    谢谢回复。重写android:background将改变每个UI元素的背景,而不仅仅是布局。我试过了,结果把整个UI搞乱了。如果看到我的自定义样式,它们将替代适用于特定图元的样式。我想对线性、相对布局等做同样的处理,但不知道如何覆盖适用于布局(从视图组继承的UI布局)的样式。@user3465654我更新了我的答案,恐怕你无法获得你想要的超越android:背景不是我的解决方案。其思想是将背景注入到每个布局中,而不必为每个布局明确指定背景。我将继续研究如何实现这一点。如果在样式中指定背景,然后为每个布局设置样式,则不必为每个布局指定背景。如果您找到了其他解决方案,请告诉我。@kiruwkna,如果可能的话,我甚至不想为每个布局指定样式,而是希望自动注入样式(就像我可以通过在我的主题中覆盖android:textViewStyle来实现TextView一样。看起来对于布局/视图组一般来说没有等价物。我下一步要尝试的是在我的主题中覆盖windowBackGround,但这也会改变动作栏的颜色,所以我需要覆盖actionBarStyle来控制其背景。我想是吧