首页 > 代码库 > 自定义控件属性
自定义控件属性
demo:defineView
1.如何自定义控件属性?2.如何动态创建组件?
3.接口回调思想
设计需要的属性
values新建attrs.xml。通过<declare-styleable>来告诉系统这是自定义的属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name ="Topbar">
<attr name = "title" format="string"/>
<attr name = "titleSize" format = "dimension"/>
<attr name = "titleTextColor" format = "color"/>
<attr name = "leftTextColor" format="color"/>
<attr name = "leftBackground" format = "reference|color"/>
<attr name = "leftText" format = "string"/>
<attr name = "rightTextColor" format="color"/>
<attr name = "rightBackground" format = "reference|color"/>
<attr name = "rightText" format = "string"/>
</declare-styleable>
</resources>
实现一个自定义的“View”
重写构造方法,在构造方法中取出自定义值存到TapeArray中,从TypeArray中取出相应的值给了相应的变量,然后组合控件并添加到
重写构造方法,在构造方法中取出自定义值存到TapeArray中,从TypeArray中取出相应的值给了相应的变量,然后组合控件并添加到
ViewGroup中,所有布局属性都在里面设置。
public class Topbar extends RelativeLayout {
private Button leftButton,rightButton;
private TextView tvText;
/**
* 左边字体的颜色
*/
private int leftTextColor;
/**
* 左边背景的颜色
*/
private Drawable leftBackground;
/**
* 左边butto文字
*/
private String leftText;
/**
* 右边字体的颜色
*/
private int rightTextColor;
/**
* 右边背景的颜色
*/
private Drawable rightBackground;
/**
* 右边butto文字
*/
private String rightText;
/**
* title要显示文字的大小
*/
private float titleTextSize;
/**
* title字体的颜色
*/
private int titleTextColor;
/**
* title的文字
*/
private String title;
private LayoutParams leftParams,rightParams,titleParams;
private topbarClickListener listener;
/**
* 实现自己的接口
* @author Kevin
*
*/
public interface topbarClickListener{
public void leftClick();
public void rightClick();
}
/**
* 将传进来的映射
* @param listener
*/
public void setOnTopClickListener(topbarClickListener listener){
this.listener = listener;
}
//需要自定义属性,所以需要attrs参数
public Topbar(Context context, AttributeSet attrs) {
super(context, attrs);
//存取自定义属性中的值返回到TypedArray
TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.Topbar);
//完成属性赋值
leftTextColor = ta.getColor(R.styleable.Topbar_leftTextColor, 0);
leftBackground = ta.getDrawable(R.styleable.Topbar_leftBackground);
rightText = ta.getString(R.styleable.Topbar_rightText);
rightTextColor = ta.getColor(R.styleable.Topbar_rightTextColor, 0);
rightBackground = ta.getDrawable(R.styleable.Topbar_rightBackground);
leftText = ta.getString(R.styleable.Topbar_leftText);
titleTextSize = ta.getDimension(R.styleable.Topbar_titleSize,0);
titleTextColor = ta.getColor(R.styleable.Topbar_titleTextColor,0);
title = ta.getString(R.styleable.Topbar_title);
//TypedArray一定要回收,避免浪费资源和由于缓存造成的错误
ta.recycle();
leftButton = new Button(context);
rightButton = new Button(context);
tvText = new TextView(context);
//自定义属性赋值给自定义的控件
leftButton.setTextColor(leftTextColor);
leftButton.setBackgroundDrawable(leftBackground);
leftButton.setText(leftText);
rightButton.setTextColor(rightTextColor);
rightButton.setBackgroundDrawable(rightBackground);
rightButton.setText(rightText);
tvText.setTextColor(titleTextColor);
tvText.setTextSize(titleTextSize);
tvText.setText(title);
tvText.setGravity(Gravity.CENTER);
setBackgroundColor(0xFFF59563);
//设置布局参数
leftParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
//居左对齐
leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,TRUE);
//以leftParams的方式添加进去
addView(leftButton,leftParams);
//设置布局参数
rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
//居右对齐
rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);
addView(rightButton,rightParams);
titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
titleParams.addRule(RelativeLayout.CENTER_IN_PARENT,TRUE);
addView(tvText,titleParams);
leftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.leftClick();
}
});
rightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.rightClick();
}
});
}
}
接口回调抽象了使用的方法,点击事件抽象了出来,让调用者决定到底做什么,topbar就被封装起来了。
引用“View”
xmlns是命名空间,需要添加命名空间来引用自己的属性,AS中auto就行,Eclipse需要完整的包名。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.llc.defineview"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.llc.defineview.MainActivity" >
<com.llc.defineview.Topbar
android:id="@+id/topbar"
android:layout_width="match_parent"
android:layout_height="40dp"
custom:leftBackground="@drawable/back_bg"
custom:leftText="back"
custom:leftTextColor="#ffffff"
custom:rightBackground="@drawable/edit_bg"
custom:rightText="more"
custom:rightTextColor="#ffffff"
custom:title="自定义标题"
custom:titleTextColor="#123421"
custom:titleSize="10sp">
</com.llc.defineview.Topbar>
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Topbar topbar = (Topbar) findViewById(R.id.topbar);
topbar.setOnTopClickListener(new Topbar.topbarClickListener() {
@Override
public void rightClick() {
Toast.makeText(MainActivity.this, "left", Toast.LENGTH_LONG).show();
}
@Override
public void leftClick() {
Toast.makeText(MainActivity.this, "right", Toast.LENGTH_LONG).show();
}
});
}
}
来自为知笔记(Wiz)
自定义控件属性
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。