android自定义控件以及复用控件

[img]http://dl.iteye.com/upload/attachment/608016/5fea8b4c-3cc8-3019-b7df-6912f2283622.png[/img]

[img]http://dl.iteye.com/upload/attachment/562665/67c83ac3-ce90-3f40-b5c1-221d430341fc.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/562667/727eb8c2-776a-3087-a0fe-a5b005e939de.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/562671/6acb423b-07af-3d90-a499-c4665e3b1056.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/562673/492d1f03-82f8-30cc-9d06-0bbf0b2f5657.jpg[/img]
对于上述几张图片,他们都有一个共同点,布局差不多,我们可以把它封装成一个共同的控件,通过自定义属性来控制子控件的显示与否与内容的不同,背景的不同。

代码:
package com.android.custom;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class TopBar extends RelativeLayout{
private Button leftBtn,rightBtn;
private TextView title;
private TopBarClickListener topBarClickListener;
private String titleStr;

private RelativeLayout.LayoutParams leftBtnLayoutParams,rightBtnLayoutParams,titleLayoutParams;
private static int LEFT_BTN_ID = 1;
private static int TITLE_ID = 2;
private static int RIGHT_BTN_ID = 3;

private Drawable leftBackground,rightBackground;
private String leftText,rightText;
private int leftTextColor,rightTextColor,titleTextColor;
private float titleTextSize;

public TopBar(Context context,AttributeSet attrs){
super(context,attrs);

TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.TopBar);

this.titleStr = ta.getString(R.styleable.TopBar_title);
this.leftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);
this.rightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground);
this.leftText = ta.getString(R.styleable.TopBar_leftText);
this.rightText = ta.getString(R.styleable.TopBar_rightText);
this.leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
this.rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
this.titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 14);
this.titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);

ta.recycle();

leftBtn = new Button(context);
rightBtn = new Button(context);
title = new TextView(context);

leftBtn.setId(LEFT_BTN_ID);
rightBtn.setId(RIGHT_BTN_ID);
title.setId(TITLE_ID);



leftBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
rightBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
titleLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);

leftBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,RelativeLayout.TRUE);
leftBtnLayoutParams.setMargins(12, 0, 0, 0);//左上右下
leftBtnLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);

rightBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
rightBtnLayoutParams.setMargins(12, 0, 0, 0);//左上右下
rightBtnLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);

titleLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
titleLayoutParams.setMargins(0, 0, 12, 0);//左上右下
titleLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
titleLayoutParams.addRule(RelativeLayout.LEFT_OF, RIGHT_BTN_ID);
titleLayoutParams.addRule(RelativeLayout.RIGHT_OF, LEFT_BTN_ID);
titleLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);

addView(leftBtn, leftBtnLayoutParams);
addView(rightBtn,rightBtnLayoutParams);
addView(title,titleLayoutParams);

leftBtn.setBackgroundDrawable(leftBackground);
leftBtn.setText(leftText);
leftBtn.setTextColor(leftTextColor);
rightBtn.setBackgroundDrawable(rightBackground);
rightBtn.setText(rightText);
rightBtn.setTextColor(rightTextColor);

title.setTextSize(22.0f);
title.setTextColor(Color.BLUE);
title.setEllipsize(TruncateAt.MIDDLE);
title.setGravity(Gravity.CENTER_HORIZONTAL);
title.setSingleLine(true);
title.setText(titleStr);
title.setTextSize(titleTextSize);
title.setTextColor(titleTextColor);

leftBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(topBarClickListener!=null){
topBarClickListener.leftBtnClick();
}
}
});

rightBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(topBarClickListener!=null){
topBarClickListener.rightBtnClick();
}
}
});
}

public void setTopBarClickListener(TopBarClickListener topBarClickListener) {
this.topBarClickListener = topBarClickListener;
}
}

package com.android.custom;

public interface TopBarClickListener {

void leftBtnClick();
void rightBtnClick();
}

package com.android.custom;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class CustomViewActivity extends Activity{
private TopBar topBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

topBar = (TopBar)findViewById(R.id.topBar);
topBar.setTopBarClickListener(new TopBarClickListener() {
@Override
public void rightBtnClick() {
//处理右边按钮所对应的逻辑
Toast.makeText(CustomViewActivity.this, "你点击的是右边的按钮", Toast.LENGTH_LONG).show();
}

@Override
public void leftBtnClick() {
//处理左边按钮所对应的逻辑
Toast.makeText(CustomViewActivity.this, "你点击的是左边的按钮", Toast.LENGTH_LONG).show();
}
});
}
}

在res/xml文件夹下面新建attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TopBar">
<attr name="title" format="string"/>
<attr name="titleTextSize" format="dimension"/>
<attr name="titleTextColor" format="color"/>
<attr name="leftTextColor" format="color"/>
<attr name="leftBackground" format="string"/>
<attr name="leftText" format="string"/>
<attr name="rightTextColor" format="color"/>
<attr name="rightBackground" format="string"/>
<attr name="rightText" format="string"/>
</declare-styleable>
</resources>


布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.android.custom"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="#ff00ff00" />
<com.android.custom.TopBar android:id="@+id/topBar"
custom:title="自定义标题" custom:titleTextSize="14.0sp" custom:titleTextColor="#ff0000" android:layout_width="fill_parent"
custom:leftBackground="@drawable/icon" custom:rightBackground="@drawable/icon"
custom:leftText="左侧" custom:rightText="右侧"
custom:leftTextColor="#123123" custom:rightTextColor="#ff0000"
android:layout_height="wrap_content" android:background="#0000ff">
</com.android.custom.TopBar>
</FrameLayout>


[img]http://dl.iteye.com/upload/attachment/562675/45ec687a-855e-3ecd-bfc8-ad8a1fa2059b.png[/img]


ps:美化的工作就交给你们自己了,隐藏的属性忘记添加了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值