android-在開發中使用自訂屬性名

來源:互聯網
上載者:User

標籤:

    在這裡我們所說的並非自訂屬性,關於自訂屬性,請參考之前的文章,講的很細,今天所說的是自訂“屬性名稱”。

    先講一下,為什麼我們需要自訂我們的屬性名稱,加入你再開發一個應用,該應用你設定好幾種主題,每一個主題對應與整個程式的很多中屬性,假如在一種主題當中有內容背景色(屬性為:background),而且還有字型背景色(同樣為:background),如果我需要更換主題的時候,以上所說的顏色的改變就會略有麻煩,如果此時,我給以上顏色的取值取了名字。比如第一個顏色我可以設定為"contentBackgrounp",第二個顏色就可以設定為"fontBackgrounp",這樣的話呢,我就可以區分這兩種 顏色,更換主題時,只需調用setTheme()方法就可以了,其他的什麼都不需要改變。

    上面說的有些不太懂,沒有辦法,語言水平就到這了,下面我用代碼去實現這些。

    首先,我需要定義以上兩種屬性:theme_atrrs.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <attr name="contentBackgrounp" format="reference"></attr>    <attr name="fontBackgrounp" format="reference"></attr></resources>

NOTICE:以上屬性的格式一定要為reference格式,因為雖然我們設定了以上屬性,但是我們不關心它是什麼,我們關心的是它指向哪裡,也就說這個屬性實際上就代表著它所指向的值。(這個意思下面我再細說)

    下面,我就要對以上屬性,在我所使用的主題中進行賦值theme.xml

<?xml version="1.0" encoding="utf-8"?><resources><!--夜間模式下的主題-->    <style name="AppBaseTheme_Dark" parent="@style/Theme.AppCompat.Light">        <item name="contentBackgrounp">@color/dark_content</item>        <item name="fontBackgrounp">@color/dark_font</item>    </style><!--日間模式下的主題-->    <style name="AppBaseTheme_Light" parent="@style/Theme.AppCompat.Light">        <item name="contentBackgrounp">@color/day_content</item>        <item name="fontBackgrounp">@color/day_font</item>    </style></resources>

下面,我們就要AndroidMainfest.xml檔案中初始化我們的主題,此處假如我們預設為日間模式

<application    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:theme="@style/AppBaseTheme_Light" >    <activity        android:name=".MainActivity"        android:label="@string/app_name" >        <intent-filter>            <action android:name="android.intent.action.MAIN" />            <category android:name="android.intent.category.LAUNCHER" />        </intent-filter>    </activity></application>

    也就是說設定如下語句,如果不設定如下語句,程式會報錯

android:theme="@style/AppBaseTheme_Light"

然後,我們就可以在我們的布局中去使用我們定義好的屬性:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:background="?attr/contentBackgrounp">    <TextView        android:layout_width="match_parent"        android:layout_height="match_parent"         android:background="?attr/fontBackgrounp"/></RelativeLayout>

因為,我們在使用過程中這兩個組件的background都是一個指向的值,它的真正值是我們在theme.xml中設定的,所以,如果要改變主題,其他的什麼都不需要改變,如果要設定為夜間模式,只需調用方法setTheme(R.style.AppBasetheme_Dark)即可。

由於setTheme方法的調用必須在調用執行方法setContentView()之前:使用,在使用時有兩種處理方法;

第一種,也是最簡單的方法:

setTheme(R.style.AppTheme_Light);this.onCreate(new Bundle());

只需以上兩句就可以達到更換主題的方法。

第二種方法,雖然代碼長度略長,但是是比較好的設計方法:

在SharedPreferences中配置一個鍵,儲存主題模式,使用過程如下:

boolean isNight = false;SharedPreferences sp;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    sp = PreferenceManager.getDefaultSharedPreferences(this);    setTheme((isNight = sp.getBoolean("isNight", false)) ? R.style.AppTheme_Dark :            R.style.AppTheme_Light);    setContentView(R.layout.activity_main);

點擊按鈕:

@Overridepublic void onClick(View v) {    int resId = v.getId();    switch (resId) {        case R.id.day:           if(isNight) {               SharedPreferences.Editor editor = sp.edit();               editor.putBoolean("isNight",false);               recreate();           }            break;        case R.id.dark:            if(!isNight) {                SharedPreferences.Editor editor = sp.edit();                editor.putBoolean("isNight", true);                recreate();            }            break;    }

關於方法recreate:

Cause this Activity to be recreated with a new instance.  This results in essentially the same flow as when the Activity is created due to a configuration change -- the current instance will go through its lifecycle to onDestroy() and a new instance then created after it.

意思是說:調用該方法,會使得該Activity重建一個新的執行個體,當前的執行個體會調用生命週期的onDestroy方法,並且在調用onDestroy方法之後用重新建立一個新的執行個體

android-在開發中使用自訂屬性名

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.