自定義組合控件

有時(shí)候一個(gè)布局需要重復(fù)被使用,為了避免更改其中一個(gè)布局可能造成所有相同的布局都要更改的局面,所以把這些相同的布局抽取出來,封裝成一個(gè)布局文件顽染。
本次組合是使用一個(gè)TextView加上一個(gè)CheckBox,大概的樣子就如圖所示了轰绵。

Paste_Image.png

創(chuàng)建一個(gè)setting_custom.xml的文件粉寞,布局如下。

Paste_Image.png

取消掉CheckBox的點(diǎn)擊事件左腔,使得整個(gè)控件可以被點(diǎn)擊唧垦。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      
  android:clickable="true"    
  android:layout_width="match_parent"    
  android:layout_height="wrap_content"    
  android:background="#33000000">    

  <TextView        
    android:id="@+id/tv_custom_content"        
    android:layout_width="wrap_content"        
    android:layout_height="wrap_content"        
    android:padding="10dp"        
    android:text="這是一個(gè)示例"        
    android:textSize="20sp"/>    

<!--取消掉CheckBox的點(diǎn)擊事件-->
  <CheckBox        
    android:id="@+id/cb_custom_check"        
    android:clickable="false"        
    android:layout_width="wrap_content"        
    android:layout_height="wrap_content"        
    android:layout_alignParentRight="true"        
    android:layout_centerVertical="true"        
    android:layout_margin="5dp"/>

</RelativeLayout>

在CustomSetting.java中開始寫代碼

package com.example.customwidget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;

/*
創(chuàng)建一個(gè)CustomSetting去繼承LinearLayout,然后寫出CustomSetting的構(gòu)造函數(shù)
*/
public class CustomSetting extends LinearLayout {    
  private View item;    
  private TextView tv_con;    
  private CheckBox cb_check;    

/*
在構(gòu)造函數(shù)中進(jìn)行初始化界面和事件
*/
  public CustomSetting(Context context, AttributeSet attrs) {        
    super(context, attrs);        
    initView();        
    initEvent();    
  }    
   private void initEvent() {        
       cb_check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
           @Override            
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                
                if (isChecked) {                    
                   tv_con.setText("被勾選了");               
               }else {                    
                   tv_con.setText("沒被勾選");               
               }            
          }       
     });    
}    

    private void initView() {        
      item = View.inflate(getContext(), R.layout.setting_custom, null);        
      addView(item);        
      tv_con = (TextView) item.findViewById(R.id.tv_custom_content);        
      cb_check = (CheckBox) item.findViewById(R.id.cb_custom_check);    
    }    

/*
以下是對(duì)外界提供一些方法液样,可以用來更改組合控件的文字顯示振亮,以及使用點(diǎn)擊事件
*/

    public void setCustomContent(String text){        
        tv_con.setText(text);    
    }    

    public void setIsChecked(boolean isChecked){        
        cb_check.setChecked(isChecked);    
    }    

    public boolean isChecked(){        
        return cb_check.isChecked();   
   }    

    public void setItemClickListener(OnClickListener listener){       
       item.setOnClickListener(listener);    
    }
}

在activity_main.xml中設(shè)置activity的主界面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  android:layout_width="match_parent"    
  android:layout_height="match_parent">    

<!--使用包名+類名-->
  <com.example.customwidget.CustomSetting        
    android:id="@+id/cs_main"        
    android:layout_width="match_parent"        
    android:layout_height="wrap_content">    
  </com.example.customwidget.CustomSetting>

</RelativeLayout>

package com.example.customwidget;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {    
  private CustomSetting cs_con;    

  @Override    
  protected void onCreate(Bundle savedInstanceState) {        
     super.onCreate(savedInstanceState);       
     initView();        
     initEvent();    
  }    
  private void initEvent() {        
    cs_con.setCustomContent("暫時(shí)還沒有被點(diǎn)擊");  //設(shè)置文字
//對(duì)整個(gè)控件使用點(diǎn)擊事件,從而改變CheckBox的狀態(tài)      
    cs_con.setItemClickListener(new View.OnClickListener() {            
       @Override            
       public void onClick(View v) {                
       cs_con.setIsChecked(!cs_con.isChecked());            
       }       
    });    
   }    
 private void initView() {        
   setContentView(R.layout.activity_main); 
//需要向下轉(zhuǎn)型成CustomSetting
   cs_con = (CustomSetting) findViewById(R.id.cs_main);    
   }
}

最終效果如下


Paste_Image.png

點(diǎn)擊后:

Paste_Image.png

取消勾選:

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞭莽,一起剝皮案震驚了整個(gè)濱河市坊秸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澎怒,老刑警劉巖褒搔,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喷面,居然都是意外死亡星瘾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門乖酬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來死相,“玉大人融求,你說我怎么就攤上這事咬像。” “怎么了生宛?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵县昂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我陷舅,道長(zhǎng)倒彰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任莱睁,我火速辦了婚禮待讳,結(jié)果婚禮上芒澜,老公的妹妹穿的比我還像新娘。我一直安慰自己创淡,他們只是感情好痴晦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳彩,像睡著了一般誊酌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上露乏,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天碧浊,我揣著相機(jī)與錄音,去河邊找鬼瘟仿。 笑死箱锐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猾骡。 我是一名探鬼主播瑞躺,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兴想!你這毒婦竟也來了幢哨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤嫂便,失蹤者是張志新(化名)和其女友劉穎捞镰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毙替,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岸售,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厂画。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凸丸。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖袱院,靈堂內(nèi)的尸體忽然破棺而出屎慢,到底是詐尸還是另有隱情,我是刑警寧澤忽洛,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布腻惠,位于F島的核電站,受9級(jí)特大地震影響欲虚,放射性物質(zhì)發(fā)生泄漏集灌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一复哆、第九天 我趴在偏房一處隱蔽的房頂上張望欣喧。 院中可真熱鬧腌零,春花似錦、人聲如沸唆阿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酷鸦。三九已至饰躲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臼隔,已是汗流浹背嘹裂。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摔握,地道東北人寄狼。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像氨淌,于是被迫代替她去往敵國和親泊愧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 如果你覺得從頭開始自定義一個(gè)View比較麻煩盛正,那么組合幾個(gè)系統(tǒng)現(xiàn)有控件來實(shí)現(xiàn)需求的功能删咱,會(huì)是你很好的一個(gè)選擇。 一...
    SherlockShi閱讀 1,540評(píng)論 0 7
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評(píng)論 25 707
  • 自定義組合控件 當(dāng)系統(tǒng)提供的控件,不足以滿足我們開發(fā)需求時(shí)续崖,可以通過自定義控件來實(shí)現(xiàn)更好的效果敲街。 組合控件的實(shí)現(xiàn)步...
    云承寒閱讀 1,193評(píng)論 0 2
  • 又重此日又重雨,又念往昔又念君 寥寥愁緒未散盡严望,點(diǎn)點(diǎn)相思何處尋
    道種魔閱讀 184評(píng)論 2 1
  • 一多艇、描述 在做項(xiàng)目的時(shí)候,碰到了需要添加So庫像吻,在以前Eclipse使用的時(shí)候峻黍,都是直接放到Libs包中就可以了,...
    卜俊文閱讀 697評(píng)論 1 7