上篇介绍了自定义控件的自定义属性篇,地址:http://www.cnblogs.com/zhangqie/p/8969163.html

这篇博文主要来说说 自定义控件的组合控件来提高布局的复用

使用自定义组合控件的好处?

我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们就可以用自定义组合控件来实现,以提高开发效率,降低开发成本为导向的,也便于扩展。

当然也可以有其他方式,如 include 标签

1:标题栏布局文件

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView
android:id="@+id/title_tab_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:background="@null"
android:minHeight="45dp"
android:textSize="14sp"
/> <TextView
android:id="@+id/title_tab_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:maxLines="1"
android:textSize="17sp" /> <Button
android:id="@+id/title_tab_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="7dp"
android:background="@null"
android:minHeight="45dp"
android:minWidth="45dp"
android:textSize="14sp" />
</merge>

2:属性文件

  <declare-styleable name="TopTabToolView">
<attr name="tab_background_color" format="color"/>
<attr name="left_tab_visible" format="boolean"/>
<attr name="left_tab_drawable" format="reference|integer"/>
<attr name="title_text" format="string"/>
<attr name="title_color" format="color"/>
<attr name="right_tab_visible" format="boolean"/>
<attr name="right_tab_text" format="string"/>
<attr name="right_tab_text_color" format="color"/>
<attr name="right_tab_drawable" format="reference|integer"/>
</declare-styleable>

3:自定义控件

public class TopTabToolView extends RelativeLayout {

    private ImageView titleBarLeftImg;
private Button titleBarRightBtn;
private TextView titleBarTitle; public TopTabToolView(Context context) {
super(context);
} public TopTabToolView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.tab_tool_layout,this,true);
titleBarLeftImg = (ImageView)findViewById(R.id.title_tab_left);
titleBarTitle = (TextView)findViewById(R.id.title_tab_title);
titleBarRightBtn = (Button)findViewById(R.id.title_tab_right); TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.TopTabToolView);
if (typedArray != null){ //背景设置
int titleBarBackGround = typedArray.getColor(R.styleable.TopTabToolView_tab_background_color, Color.WHITE);
setBackgroundColor(titleBarBackGround); //-------------------------标题栏左边----------------------
boolean leftImgVisible = typedArray.getBoolean(R.styleable.TopTabToolView_left_tab_visible,true);
if (leftImgVisible){
titleBarLeftImg.setVisibility(VISIBLE);
}else {
titleBarLeftImg.setVisibility(GONE);
}
//设置图标
int leftTabDrawble = typedArray.getResourceId(R.styleable.TopTabToolView_left_tab_drawable,-1);
if (leftTabDrawble != -1){
titleBarLeftImg.setImageResource(leftTabDrawble);
} //--------------------------中间标题-----------------------
String titleText = typedArray.getString(R.styleable.TopTabToolView_title_text);
if (!TextUtils.isEmpty(titleText)){
titleBarTitle.setText(titleText);
//设置字体颜色
int titleTextColor = typedArray.getColor(R.styleable.TopTabToolView_title_color,Color.WHITE);
titleBarTitle.setTextColor(titleTextColor);
} //------------------------标题栏右边-------------------------
boolean rightButtonVisible = typedArray.getBoolean(R.styleable.TopTabToolView_right_tab_visible,true);
if (rightButtonVisible){
titleBarRightBtn.setVisibility(VISIBLE);
}else {
titleBarRightBtn.setVisibility(INVISIBLE);
} //设置文字
String rightBtnText = typedArray.getString(R.styleable.TopTabToolView_right_tab_text);
if (!TextUtils.isEmpty(rightBtnText)){
titleBarRightBtn.setText(rightBtnText);
int rightBtnTextColor = typedArray.getColor(R.styleable.TopTabToolView_right_tab_text_color,Color.WHITE);
titleBarRightBtn.setTextColor(rightBtnTextColor);
} //设置图标
int rightBtnDrawable = typedArray.getResourceId(R.styleable.TopTabToolView_right_tab_drawable,-1);
if (rightBtnDrawable != -1){
titleBarRightBtn.setCompoundDrawablesWithIntrinsicBounds(0,0,rightBtnDrawable,0);
} typedArray.recycle();
}
} public TopTabToolView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} /**
* 设置标题
* @param title
*/
public void setTitle(String title){
if (!TextUtils.isEmpty(title)){
titleBarTitle.setText(title);
}
} /***
* 左边点击
* @param onClickListener
*/
public void setLeftOnClickListener(OnClickListener onClickListener){
if (onClickListener != null){
titleBarLeftImg.setOnClickListener(onClickListener);
}
} /***
* 右边点击
* @param onClickListener
*/
public void setRightOnClickListener(OnClickListener onClickListener){
if (onClickListener != null){
titleBarRightBtn.setOnClickListener(onClickListener);
}
}
}

属性文件的设置也可以通过Java代码修改, 如: Title标题

4:Activity代码

public class Demo3Activity extends AppCompatActivity {

    TopTabToolView topTabToolView;

    @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.demo3);
initView();
} private void initView(){
topTabToolView = (TopTabToolView) findViewById(R.id.tab1);
topTabToolView.setTitle("代码设置标题");
topTabToolView.setLeftOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
topTabToolView.setRightOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(Demo3Activity.this,"关闭",Toast.LENGTH_LONG).show();
}
});
}
}

效果图:

源码地址:https://github.com/DickyQie/android-custom-control

最新文章

  1. 【转】PHP网站(nginx、php-fpm、mysql) 用户权限解析
  2. UIImage NSData 相互转化
  3. PHPCMS联动菜单的调用函数get_linkage方法详解
  4. SharePoint 2013 排错之&quot;Code blocks are not allowed in this file&quot;
  5. JavaScript Patterns 4.6 Immediate Object Initialization
  6. c++ 容器(list学习总结)
  7. [Bug-IOS] - linker command failed with exit code 1 (use -v to see invocation)
  8. jq实现搜索引擎的提示效果
  9. getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
  10. Magic of David Copperfield II(奇偶性)
  11. 如何使用fiddler进行android手机测试
  12. Python基础入门教程
  13. ORACLE函数之日期时间运算函数
  14. 10.API 接口自动化测试的基本原理
  15. Java 中 AOP —— 探讨其存在价值及实现方式对比
  16. OpenCV 学习笔记 05 人脸检测和识别 AttributeError: module &#39;cv2&#39; has no attribute &#39;face&#39;
  17. C# 动态加载组件后怎么在开发环境中调试
  18. 转:CRF++词性标注
  19. java.sql.SQLException: Value &#39;0000-00-00 00:00:00&#39; can not be represented as java.sql.Date
  20. chrome 常用插件下载安装

热门文章

  1. 在cygwin下创建的文件位于windows的哪个目录下?
  2. X-Pack for the Elastic Stack [6.2] &#187; Securing the Elastic Stack &#187;Setting Up User Authentication
  3. Elasticsearch查询Index以及删除
  4. 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T2(模拟)
  5. 《操作系统_时间片轮转RR进程调度算法》
  6. Kubernetes之Controllers三
  7. Linux下 查看CPU信息
  8. 在服务器端对sshd做白名单
  9. 转 Failed to run the WC DB work queue associated with 错误的解决
  10. Codeforces 776E The Holmes Children