日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Style在Android中的繼承關(guān)系

Android的Styles(樣式)和Themes(主題)非常類似Web開發(fā)里的CSS,方便開發(fā)者將頁面內(nèi)容和布局呈現(xiàn)分開。Style和Theme在Android里的定義方式是完全一樣的,兩者只是概念上的區(qū)別:Style作用在單個視圖或控件上,而Theme用于Activity或整個應(yīng)用程序。由于作用范圍的不同,Theme也就需要比Style包含更多的定義屬性值的項目(item)。不過本文,我將Style和Theme都歸為Style來稱呼。

成都創(chuàng)新互聯(lián)專注于寧波企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站定制開發(fā)。寧波網(wǎng)站建設(shè)公司,為寧波等地區(qū)提供建站服務(wù)。全流程定制制作,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

Android的Style和Web的CSS相比,有一個缺陷就是只能針對一個對象只能通過android:theme="@style/AppTheme"或style="@style/MyStyle"指定一個值。而CSS則可以通過class屬性在DOM元素上定義多個樣式來達到組合的效果。不過Style也有CSS沒有的功能,那就是繼承(Inheritance)。(當然CSS通過LESS和SASS這些工具也獲得繼承的能力。)

Style繼承簡介

根據(jù)Android Developers官方文檔的介紹,定義Style的繼承有兩種方式:一是通過parent標志父Style;

 
 
 
 
  1.  
  2.     #00FF00 
  3.  

另一種則是將父Style的名字作為前綴,然后通過“.”連接新定義Style的名字:

 
 
 
 
  1. #FF0000
  2.  

第二種方式可以***連接子Style來實踐多層繼承:

 
 
 
 
  1. 30sp
  2.  

相對***種,Android對第二種方式做出的限制就是Style必須是由自己定義的,或者說父Style和子Style必須是定義在同一個程序內(nèi),不能是引用第三方或系統(tǒng)的Style。畢竟對于系統(tǒng)的Style的引用是需要加上android:前綴作為命名空間。

其次在使用Style時,對于第二種方式定義的Style,必須引用其完全的名字,也就是說必須要包含完整的前綴和名字:

 
 
 
 
  1. style="@style/CodeFont.Red.Big"
  2. ... /> 

Android對于***種定義方式并沒用限制,所以所有以第二種方式定義的Style都可以轉(zhuǎn)用***種:

 
 
 
 
  1. 30sp
  2.  

只要parent中的名字對應(yīng)上實際定義的Style名字即可。不過換成***種后Style的名字如果太簡潔就容易沖突了。

兩種繼承方式混合的效果

前面說到Style的兩種繼承方式的效果是一致的,那假如將兩種方式混在一起定義一個Style又會是什么樣的效果呢?下邊就用實際例子來分析一下。

首先定義一些實驗所需的自定義屬性(attr),(這樣可以減少系統(tǒng)屬性的干擾,因為系統(tǒng)總是會為它的屬性定義值,那樣可能無法分辨***的效果是來自系統(tǒng)還是定義的值)

 
 
 
 
  1.     
  2.         
  3.         
  4.         
  5.     
  6.  

接著定義一個TextView的子類,并在其中獲取上邊自定義屬性的值并賦予TextView去呈現(xiàn):

 
 
 
 
  1. import android.util.TypedValue;
  2. import android.widget.TextView;
  3. /**
  4. * @author Ider
  5. */
  6. public class StyledTextView extends TextView {
  7.     public StyledTextView(Context context) {
  8.         this(context, null);
  9.     }
  10.     public StyledTextView(Context context, AttributeSet attrs) {
  11.         this(context, attrs, 0);
  12.     }
  13.     public StyledTextView(Context context, AttributeSet attrs, int defStyleAttr) {
  14.         super(context, attrs, defStyleAttr);
  15.         final TypedArray a = context.getTheme()
  16.                 .obtainStyledAttributes(attrs, R.styleable.CustomStyle, defStyleAttr, 0);
  17.         final CharSequence text = a.getText(R.styleable.CustomStyle_customText);
  18.         final int color = a.getColor(R.styleable.CustomStyle_customColor, Color.RED);
  19.         final float size = a.getDimensionPixelSize(R.styleable.CustomStyle_customSize, 70);
  20.         a.recycle();
  21.         setText(text);
  22.         setTextColor(color);
  23.         setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
  24.     }

然后就是定義研究所需的Style

 
 
 
 
  1.     
  2.         @android:color/holo_orange_dark
  3.         Hello World
  4.         30dp
  5.     
  6.     
  7.         www.iderzheng.com
  8.     
  9.     
  10.         @android:color/holo_blue_dark
  11.     
  12.     
  13.     
  14.     
  15.         blog.iderzheng.com
  16.     
  17.  

上邊定義的Style里,SuperStyleOne將通過添加前綴的方式作用到子Style上,而SuperStyleTwo則通過指定到parent來其作用??梢钥吹絊ubTwo和SubThree混合了兩種方式。

***在Activity的布局視圖里使用自定類并設(shè)定上不同的Style

 
 
 
 
  1.               xmlns:tools="http://schemas.android.com/tools"
  2.               android:orientation="vertical"
  3.               android:layout_width="match_parent"
  4.               android:layout_height="match_parent"
  5.               android:paddingLeft="@dimen/activity_horizontal_margin"
  6.               android:paddingRight="@dimen/activity_horizontal_margin"
  7.               android:paddingTop="@dimen/activity_vertical_margin"
  8.               android:paddingBottom="@dimen/activity_vertical_margin"
  9.               tools:context=".MainActivity">
  10.     
  11.             style="@style/SuperStyleOne"
  12.             android:layout_width="wrap_content"
  13.             android:layout_height="wrap_content"/>
  14.     
  15.             style="@style/SuperStyleOne.SubOne"
  16.             android:layout_width="wrap_content"
  17.             android:layout_height="wrap_content"/>
  18.     
  19.             style="@style/SuperStyleOne.SubTwo"
  20.             android:layout_width="wrap_content"
  21.             android:layout_height="wrap_content"/>
  22.     
  23.             style="@style/SuperStyleOne.SubThree"
  24.             android:layout_width="wrap_content"
  25.             android:layout_height="wrap_content"/>
  26.  

運行之后得到效果如下:

***個和第二個都是Style標準的使用方式,也看到它們正確地獲得了定義的屬性值,子Style也正確的繼承和覆蓋了父Style的屬性值。

對于第三個和第四個,它們呈現(xiàn)的顏色是代碼中使用的默認紅色(Color.RED),字體的值也是源自代碼中的使用值,所以明顯比前兩者要小。這也就是說它們并沒用繼承下SuperStyleOne中定義的字體大小和顏色。但是SuperStyleTwo中定義的內(nèi)容被第三個正確的顯示了出來,也說明SubTwo成功繼承通過parent指定的父Style的內(nèi)容。而第四個呈現(xiàn)出來內(nèi)容則說明覆蓋的效果也是正確的。

在做這個試驗之前,我一直以為兩種方式會同時其作用,只是用parent指定比用前綴有高優(yōu)先級。也就是說Android會先從當前Style定義中找某個屬性的值,如果沒有找到就轉(zhuǎn)到parent指定的父Style中找,還沒有則轉(zhuǎn)到前綴指定的父Style中找。但是通過上邊的結(jié)果表明:當使用parent指定父Style后,前綴方式則不在其作用,只是作為Style的名字。也就是說:Android的Style不支持多繼承。Style的繼承只能單線一層層下來。

反過來在看看系統(tǒng)定義的Style也更容易懂了,比如打開themes_holo.xml,會看到很多一樣的內(nèi)容被”冗余”地定義在Theme.Holo和Theme.Holo.Light兩個Style下。但因為Theme.Holo.Light用parent指定了其父Style是Theme.Light,所以Theme.Holo.Light并沒有從Theme.Holo繼承任何屬性值,也因此這樣的冗余是必須的。

 
 
 
 
  1. ... ... ... ...
  2.  

使用Theme.Holo.Light作為Style的名字只是為了名字更加的清晰明了。

References:

  1. Styles and Themes | Android Developers
  2. Android XML theme inheriting from two parent themes? – Stack Overflow
  3. xml – Reason why style attribute does not use the android: namespace prefix – Stack Overflow

網(wǎng)站標題:Style在Android中的繼承關(guān)系
當前URL:http://www.5511xx.com/article/djcjioc.html