乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Android.自定義控件的實現(xiàn)

       噢麥噶 2012-07-11

      可能是一直都在做Web的富客戶端開發(fā)的緣故吧,在接觸Android之后,發(fā)現(xiàn)其控件實在慘不忍睹(不知道是否說得過于偏激),我所說的慘不忍睹的意思不是說控件難看,Android的控件非常漂亮,這是我們公司公認的,但是最大的缺點在于控件功能非常弱小。弱小得一個Radio只能放一個text,而沒有value(key)可以存放。這就是為什么我說慘不忍睹的原因。

      但是這不能怪google,畢竟才剛剛發(fā)展起來,Android提供的只是一個最基本的控件實現(xiàn),而非一個完整、強大的實現(xiàn)??尚业氖?,Android提供了自定義控件的實現(xiàn)。有了自定義控件,我們就可以再Android的基礎(chǔ)控件上實現(xiàn)我們想要的功能了。經(jīng)過一天的摸索,我終于實現(xiàn)了我第一個自定義的組合控件——RadioButton組合RadioGroup!

      下面我將帶領(lǐng)大家進入Android自定義控件的世界。如果覺得我的文章能夠幫助大家的話,請大方留下你的一些話語。因為你們的留言是我分享經(jīng)驗的精神源泉!謝謝!

      1、設(shè)置自定義控件:Android自帶的RadioButton只能存放text,這不符合我們的需求,我們需要一個可以同時存放key-value對應(yīng)的鍵值。所以我們要編寫一個自定義控件能存放key-value。

      設(shè)計思路:新建一個類叫org.kandy.view.RadioButton,繼承自android.wedget.RadioButton,重寫父類的所有構(gòu)造方法。這樣我們就實現(xiàn)了一個跟父類一摸一樣的控件。在此基礎(chǔ)上加入我們需要的功能:加入一個屬性value,用來存放RadioButton的key。

      代碼如下:

      public class RadioButton extends android.widget.RadioButton {

      private String mValue;

      public RadioButton(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      }

      public String getValue() {
      return this.mValue;
      }

      public void setValue(String value) {
      this.mValue = value;
      }
      public RadioButton(Context context, AttributeSet attrs) {
      super(context, attrs);
      try {
      /**
      * 跟values/attrs.xml里面定義的屬性綁定
      */
      TypedArray a = context.obtainStyledAttributes(attrs,
      R.styleable.RadioButton);
      this.mValue = a.getString(R.styleable.RadioButton_value);
      a.recycle();

      } catch (Exception e) {
      e.printStackTrace();
      }

      }

      public RadioButton(Context context) {
      super(context);
      }


      }

      紅色代碼可以先不看。先看我們新加入的屬性value,由于Android習(xí)慣屬性命名以m開頭。所以我們自定義控件就按照這個規(guī)則來寫。不過對于setter、getter方法來說,不需要加入m。像上面的:屬性名稱mValue,setter:setValue(),getter:getValue()。當(dāng)然,你也可以不按照Android的習(xí)慣來命名。

      這樣,我們就可以使用這個自定義控件了。而且可以給它設(shè)置一個value,加上父類的text屬性。我們就可以在RadioButton中加入key-value的鍵值了。當(dāng)然,這里面的key對應(yīng)是控件的value屬性,value是對應(yīng)控件的text屬性。完了?沒有。自定義控件才剛開始了。

      2、XML中引用自定義控件

      在XML中加入自定義控件其實很簡單。只需要在控件名字前加入包名即可。如下:

      <org.kandy.view.RadioButton android:id="@id/isPayDepositTrue" fsms:value="true"
      android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:text="@string/yes" android:textSize="18sp">
      </org.kandy.view.RadioButton>

      同樣,紅色部分可以先不看,也不需要加入到代碼中,這個時候加入會報錯,請注意。

      3、attrs.xml屬性定義。

      在我們的思想中,既然我在自定義控件中加入了一個新的屬性,那么我就應(yīng)該能夠在xml中引用它,并對它賦初始值。我當(dāng)初也是這樣想的。可是卻無從下手。就是這一點,折騰了我一個下午。

      正解:res/values/attrs.xml中定義屬性,在自定義控件中獲取這個屬性,然后跟自定義控件的屬性相綁定。

      attrs.xml如果沒有,就新建一個。這里只存放自定義控件中需要的屬性,在我看來,這個文件是一個中介,負責(zé)將layout/xx.xml里面的對這個變量的引用和自定義控件里面的屬性綁定起來。

      attrs.xml完整代碼如下:

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
      <declare-styleable name="RadioButton"><!-- 控件名稱-->
      <attr name="value" format="string"/><!-- 屬性名稱,類型-->
      </declare-styleable>
      </resources>

      如果res下沒有錯誤的話,在R中應(yīng)該就會生成這些資源的id。這樣我們就能在自定義控件中引用他們。

      4、控件屬性與XML定義綁定。

      這下子我們又回到了自定義控件的編寫上來了。先看看我們在第一點提到的紅色字體部分。這一部分就是實現(xiàn)控件屬性與XML定義綁定的代碼。

      /**
      * 跟values/attrs.xml里面定義的屬性綁定
      */
      TypedArray a = context.obtainStyledAttributes(attrs,
      R.styleable.RadioButton);
      this.mValue = a.getString(R.styleable.RadioButton_value);
      a.recycle();

      TypedArray其實就是一個存放資源的Array,首先從上下文中獲取到R.styleable.RadioButton這個屬性資源的資源數(shù)組。attrs是構(gòu)造函數(shù)傳進來,應(yīng)該就是對應(yīng)attrs.xml文件。a.getString(R.styleable.RadioButton_value);這句代碼就是獲取attrs.xml中定義的屬性,并將這個屬性的值傳給本控件的mValue.最后,返回一個綁定結(jié)束的信號給資源:a.recycle();綁定結(jié)束。

      5、在xml中對控件賦初始值。

      請看第2點,綁定結(jié)束后可以在需要賦初始值的地方賦值。

      <ScrollView android:layout_width="fill_parent"
      android:layout_height="fill_parent" xmlns:android="http://schemas./apk/res/android"
      xmlns:fsms=http://schemas./apk/res/org.kandy>

      <org.kandy.view.RadioButton android:id="@id/isPayDepositTrue" fsms:value="true"
      android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:text="@string/yes" android:textSize="18sp">
      </org.kandy.view.RadioButton>

      </ScrollView>

      紅色部分首先聲明命名空間。命名空間為fsms.路徑是http://schemas./apk/res/這一部分是不變的,后面接的是R的路徑:org.kandy.R。然后在自定義控件的xml描述中就可以這樣使用fsms:value="true"。這樣就實現(xiàn)了自定義控件的初始化賦值。

      6、RadioGroup、RadioButton組合控件的實現(xiàn)

      上面是自定義控件的實現(xiàn),下面將要說的是組合控件的實現(xiàn)。在組合控件中,最經(jīng)常用到的應(yīng)該就是RadioGroup和RadioButton。RadioButton的實現(xiàn)已經(jīng)在上面介紹了。下面要介紹RadioGroup的自定義控件和功能擴展:

      代碼如下:

      public class RadioGroup extends android.widget.RadioGroup {

      private String mValue;

      public RadioGroup(Context context, AttributeSet attrs) {
      super(context, attrs);
      }

      public RadioGroup(Context context) {
      super(context);
      }
      // 設(shè)置子控件的值
      public void setChildValue(){
      int n = this.getChildCount();
      for(int i=0;i<n;i++){
      final RadioButton radio = (RadioButton)this.getChildAt(i);
      if(radio.getValue().equals(this.mValue)){
      radio.setChecked(true);
      }else{
      radio.setChecked(false);
      }
      }
      }
      // 獲取子類的值
      public void getChildValue(){
      int n = this.getChildCount();
      for(int i=0;i<n;i++){
      RadioButton radio = (RadioButton)this.getChildAt(i);
      if(radio.isChecked()){
      this.mValue=radio.getValue();
      }
      }
      }

      public void setValue(String value) {
      this.mValue = value;
      setChildValue();
      }

      public String getValue(){
      getChildValue();
      return this.mValue;
      }
      }

      RadioGroup只做兩件事:獲取子控件(RadioButton)所選擇的值;設(shè)置子控件要選擇的值。

      方法非常簡單,循環(huán)或者RadioGroup的子控件,檢測哪個控件被checked,然后getValue,將此value賦值給RadioGroup的擴展屬性value。在這里不多說了。相信大家都能看懂。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多