使用主题和样式继承在全局Android中应用样式

时间:2016-01-11 20:33:11

标签: android xml inheritance android-theme android-styles

我正在尝试为我的整个应用创建基本主题,我为基本组件创建了自定义样式,例如EditTextButtonTextView,并希望在我的应用中全局设置它们。

这是我的xml代码。

 <style name="AppThemeBase" parent="Theme.AppCompat.NoActionBar">
        <item name="colorPrimary">@color/base_app_color</item>
        <item name="colorPrimaryDark">@color/base_app_color</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="windowActionBarOverlay">true</item>
        <item name="windowActionModeOverlay">true</item>
        <item name="android:editTextStyle">@style/EditTextBaseStyle</item>
        <item name="android:textViewStyle">@style/TextViewBaseStyle</item>
    </style>

我的自定义编辑文字样式

<style name="EditTextBaseStyle" parent="Widget.AppCompat.EditText">
        <item name="android:textColor">@color/base_text_color</item>
        <item name="android:textSize">@dimen/text_size_edit_text</item>
        <item name="android:textColorHint">@color/base_hint_color</item>
        <item name="android:layout_centerHorizontal">true</item>
        <item name="android:background">@drawable/edit_text_rounded_corners_bg</item>
    </style>

我还尝试使用@android:style/Widget.EditText作为父母。

<style name="TextViewBaseStyle" parent="@android:style/Widget.TextView">
    <item name="android:textColor">@color/base_text_color</item>
    <item name="android:textSize">@dimen/size_text_base</item>
    <item name="android:layout_margin">@dimen/margin_text_view_base</item>
</style>

当然还有AndroidManifest.xml档案

<application
    android:name=".application.QrApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_logo_green"
    android:label="@string/app_name"
    android:theme="@style/AppThemeBase">
    <activity
        android:name=".ui.activities.LoginActivity"
        android:configChanges="orientation|keyboardHidden"
        android:label="@string/app_name"
        android:noHistory="true"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

我有几个问题

  1. 为什么它不为每个视图(EditText和TextView)应用样式,如果在xml布局中手动设置样式它就像一个魅力,但我不能让它全局工作
  2. 关于样式继承。有两种类型的继承显式或隐式,或者用于使用.(点)的用户自定义样式,并使用关键字parent作为默认主题,但是如果将这种类型的继承结合起来将会是这样的{{1 }}?
  3. 样式和主题是否应用于活动内的片段,理论上它应该是因为使用<style name="SomeStyle.ParentStyle" parent="Widget.AppCompat.Button">来使用活动中的片段上下文?
  4. 如果您有任何想法会导致此类问题,请帮助解决或至少分享您的想法。

    感谢。

1 个答案:

答案 0 :(得分:0)

问题解决了

而不是覆盖

<item name="android:editTextStyle">@style/EditTextBaseStyle</item>

我必须覆盖

<item name="editTextStyle">@style/EditTextBaseStyle</item>

要确定需要覆盖的样式项,请遵循基本样式/主题的继承树,您将找到需要使用的样式项的名称。

但是注意
文本视图样式应该仍然是

<item name="android:textViewStyle">@style/TextViewBaseStyle</item>

这很奇怪但是原样。