自定义组合控件

有时候一个布局需要重复被使用,为了避免更改其中一个布局可能造成所有相同的布局都要更改的局面,所以把这些相同的布局抽取出来,封装成一个布局文件。
本次组合是使用一个TextView加上一个CheckBox,大概的样子就如图所示了。

Paste_Image.png

创建一个setting_custom.xml的文件,布局如下。

Paste_Image.png

取消掉CheckBox的点击事件,使得整个控件可以被点击。

<?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="这是一个示例"        
    android:textSize="20sp"/>    

<!--取消掉CheckBox的点击事件-->
  <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;

/*
创建一个CustomSetting去继承LinearLayout,然后写出CustomSetting的构造函数
*/
public class CustomSetting extends LinearLayout {    
  private View item;    
  private TextView tv_con;    
  private CheckBox cb_check;    

/*
在构造函数中进行初始化界面和事件
*/
  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);    
    }    

/*
以下是对外界提供一些方法,可以用来更改组合控件的文字显示,以及使用点击事件
*/

    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中设置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("暂时还没有被点击");  //设置文字
//对整个控件使用点击事件,从而改变CheckBox的状态      
    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); 
//需要向下转型成CustomSetting
   cs_con = (CustomSetting) findViewById(R.id.cs_main);    
   }
}

最终效果如下


Paste_Image.png

点击后:

Paste_Image.png

取消勾选:

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容