首先看一下theme中的设置,代码如下
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.Funui" parent="Theme.Holo.Light"> <item name="isFunui">true</item> <item name="colorForeground">@android:color/bright_foreground_funui</item> <item name="colorForegroundInverse">@android:color/bright_foreground_funui_inverse</item> <item name="colorBackground">@android:color/background_funui</item> <item name="colorBackgroundCacheHint">@android:drawable/background_cache_hint_selector_funui</item> <item name="disabledAlpha">0.5</item> <item name="backgroundDimAmount">0.6</item> <item name="colorPressedHighlight">@color/funui_gray_light</item> <item name="colorLongPressedHighlight">@color/funui_gray_bright</item> <item name="colorFocusedHighlight">@color/funui_blue_dark</item> <item name="colorMultiSelectHighlight">@color/funui_green_light</item> <item name="colorActivatedHighlight">@color/funui_blue_dark</item> <!-- Text styles --> <item name="textAppearance">@android:style/TextAppearance.Funui</item> <item name="textAppearanceInverse">@android:style/TextAppearance.Funui.Inverse</item> <item name="textColorPrimary">@android:color/primary_text_funui</item> <item name="textColorSecondary">@android:color/secondary_text_funui</item> <item name="textColorTertiary">@android:color/tertiary_text_funui</item> <item name="textColorPrimaryInverse">@android:color/primary_text_funui_inverse</item> <item name="textColorSecondaryInverse">@android:color/secondary_text_funui_inverse</item> <item name="textColorTertiaryInverse">@android:color/tertiary_text_funui_inverse</item> <item name="textColorPrimaryDisableOnly">@android:color/primary_text_disable_only_funui</item> <item name="textColorPrimaryInverseDisableOnly">@android:color/primary_text_disable_only_funui_inverse</item> <item name="textColorPrimaryNoDisable">@android:color/primary_text_nodisable_funui</item> <item name="textColorSecondaryNoDisable">@android:color/secondary_text_nodisable_funui</item> <item name="textColorPrimaryInverseNoDisable">@android:color/primary_text_nodisable_funui_inverse</item> <item name="textColorSecondaryInverseNoDisable">@android:color/secondary_text_nodisable_funui_inverse</item> <item name="textColorHint">@android:color/hint_foreground_funui</item> <item name="textColorHintInverse">@android:color/hint_foreground_funui_inverse</item> <item name="textColorSearchUrl">@android:color/search_url_text_funui</item> <item name="textColorHighlight">@android:color/highlighted_text_funui</item> <item name="textColorHighlightInverse">@android:color/highlighted_text_funui_inverse</item> <item name="textColorLink">@android:color/funui_blue_light</item> <item name="textColorLinkInverse">@android:color/funui_blue_light</item> <item name="textColorAlertDialogListItem">@android:color/primary_text_funui</item>
<item name="checkboxStyle">@android:style/Widget.Funui.CompoundButton.CheckBox</item>
<item name="searchViewTextColor">@color/searchview_text_color</item>
<item name="textAppearanceLarge">@android:style/TextAppearance.Funui.Large</item> <item name="textAppearanceMedium">@android:style/TextAppearance.Funui.Medium</item> <item name="textAppearanceSmall">@android:style/TextAppearance.Funui.Small</item> <item name="textAppearanceLargeInverse">@android:style/TextAppearance.Funui.Large.Inverse</item> <item name="textAppearanceMediumInverse">@android:style/TextAppearance.Funui.Medium.Inverse</item>
</Resources>
然后我们查找一下其中的一个属性<item name="checkboxStyle">@android:style/Widget.Funui.CompoundButton.CheckBox</item>
我们先不说后面的@android:style/Widget.Funui.CompoundButton.CheckBox 就先看一下这个checkboxStyle ,搜索以后,发现如下代码
public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet attrs) {
//引用的地方
this(context, attrs, com.android.internal.R.attr.buttonStyle); } public Button(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); event.setClassName(Button.class.getName()); } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(Button.class.getName()); } }
这就是第一种情况,也就是,属性是直接在代码中添加的,有点类似于我们的自定义属性。不过呢,这个明显的是,直接添加的一个theme,他的作用就跟我们直接创建一个aaa的style,然后new (.....,R.style.aaa)一样的,
只不过它是应用整个activity的
另外我们还发现了它出现在另外一个地方res/values/attr.xml中,如下
<!--类似于一个声明-->
<attr name="checkboxStyle" format="reference" /> <!-- Default CheckedTextView style. --> <attr name="checkedTextViewStyle" format="reference" /> <!-- Default ListView style for drop downs. --> <attr name="dropDownListViewStyle" format="reference" /> <!-- Default EditText style. --> <attr name="editTextStyle" format="reference" /> <!-- Default ExpandableListView style. --> <attr name="expandableListViewStyle" format="reference" /> <!-- ExpandableListView with white background. --> <attr name="expandableListViewWhiteStyle" format="reference" /> <!-- Default Gallery style. --> <attr name="galleryStyle" format="reference" /> <!-- Default GestureOverlayView style. --> <attr name="gestureOverlayViewStyle" format="reference" /> <!-- Default GridView style. --> <attr name="gridViewStyle" format="reference" /> <!-- The style resource to use for an ImageButton. --> <attr name="imageButtonStyle" format="reference" /> <!-- The style resource to use for an ImageButton that is an image well. --> <attr name="imageWellStyle" format="reference" /> <!-- Default ListView style. --> <attr name="listViewStyle" format="reference" />
至于它后面跟的数值Widget.Funui.CompoundButton.CheckBox,如下
<style name="Widget.CompoundButton.CheckBox"> <item name="android:button">?android:attr/listChoiceIndicatorMultiple</item> </style>
我们可以看到,它其实就是一个checkbox 中button属性的设置
下面我们来查找另外的一个属性看看结果<item name="searchViewTextColor">@color/searchview_text_color</item>
仍然是在res/values/attr.xml里面看到它的身影
<attr name="searchViewTextColor" format="reference|color" />
另外,并没有在代码中看到它,只是在一些xml中看到了,如下
<view class="android.widget.SearchView$SearchAutoComplete" android:id="@+id/search_src_text" android:layout_height="36dip" android:layout_width="0dp" android:layout_weight="1" android:minWidth="@dimen/search_view_text_min_width" android:layout_gravity="center_vertical" android:paddingStart="@dimen/dropdownitem_text_padding_left" android:paddingEnd="@dimen/dropdownitem_text_padding_right" android:singleLine="true" android:ellipsize="end" android:background="@null" android:inputType="text|textAutoComplete|textNoSuggestions" android:textColor="?android:attr/searchViewTextColor" android:textColorHint="?android:attr/searchViewTextColorHint" android:imeOptions="actionSearch" android:dropDownHeight="wrap_content" android:dropDownAnchor="@id/search_edit_frame" android:dropDownVerticalOffset="0dip" android:dropDownHorizontalOffset="0dip" android:contentDescription="@string/searchview_description_query" />
android:textColor="?android:attr/searchViewTextColor"
它是引用了
searchViewTextColor 这个值在theme有了定义,相当于引用了@color/searchview_text_color
这里我们是不是可以得出一个结论呢,
theme下定义的资源,我们都是可以直接使用的,也就是它就是一个资源的别名,就像定义在value中一样。
不同的是,它是可以被覆盖的,也就是说,当前应用会覆盖系统默认的