自定义一个包含了各种控件的viewGroup, 这里主要是用来给 app “我的” 模块下的多条类似的item, 有一点,自定义的view不能放到作为lib的moudel里面,不然就会像使用pulltorefresh一样,你使用自定义的控件的时候,自己的属性系统不会提示不说,其他的控件的属性也不会提示,很蛋疼;
- 1、自定义View的属性
- 2、在View的构造方法中获得我们自定义的属性
- 3、重写onMesure
- 4、重写onDraw
1.新建布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">
<ImageView
android:id="@+id/img_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
/>
<TextView
android:id="@+id/tv_left"
style="@style/tv_home_16sp_33"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text=""/>
<TextView
android:id="@+id/tv_right"
style="@style/tv_home_16sp_33"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:text=""/>
<ImageView
android:id="@+id/img_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"/>
</LinearLayout>
2.新建类
package com.xunku.basetest.customView;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.xunku.basetest.R;
/**
* Created 郑贤鑫 on 2017/2/10.
*
* 主要用于 app 我的 模块 里面有多个item
* 可能还有很多不够周到的地方,以后再修改
*/
public class MeItem extends LinearLayout {
ImageView img_left;
TextView tv_left;
TextView tv_right;
ImageView img_right;
public MeItem(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.custom_me_item,this,true);
img_left= (ImageView) findViewById(R.id.img_left);
tv_left= (TextView) findViewById(R.id.tv_left);
tv_right= (TextView) findViewById(R.id.tv_right);
img_right= (ImageView) findViewById(R.id.img_right);
// TypedArray attributes = context.obtainStyledAttributes(attrs,R.styleable.mItem);
TypedArray attributes = context.obtainStyledAttributes(attrs,R.styleable.MeItem);
if(attributes != null){
//图片资源
int leftImgRes;
int rightImgRes;
//文字资源
String leftText;
String rightText;
//大小
int leftImgSize;
int leftTextSize;
int rightImgSize;
int rightTextSize;
//颜色
int leftTextColor;
int rightTextColor;
leftImgRes=attributes.getResourceId(R.styleable.MeItem_leftImg,-1);
rightImgRes=attributes.getResourceId(R.styleable.MeItem_rightImg,-1);
leftText=attributes.getString(R.styleable.MeItem_leftText);
rightText=attributes.getString(R.styleable.MeItem_rightText);
leftImgSize = attributes.getDimensionPixelSize(R.styleable.MeItem_leftImgSize,40);
leftTextSize = attributes.getDimensionPixelSize(R.styleable.MeItem_leftTextSize,16);
rightImgSize = attributes.getDimensionPixelSize(R.styleable.MeItem_rightImgSize,40);
rightTextSize = attributes.getDimensionPixelSize(R.styleable.MeItem_rightTextSize,16);
leftTextColor=attributes.getColor(R.styleable.MeItem_leftTextColor, Color.BLACK);
rightTextColor=attributes.getColor(R.styleable.MeItem_rightTextColor, Color.BLACK);
// img_left.setImageResource(rightImgRes);
// tv_left.setText(leftText);
// tv_right.setText(rightText);
//左边图片
setImg(img_left,leftImgRes,leftImgSize);
//右边图片
setImg(img_right,rightImgRes,rightImgSize);
//左边文字
setTextView(tv_left,leftText,leftTextSize,leftTextColor);
//右边文字
setTextView(tv_right,rightText,rightTextSize,rightTextColor);
}
attributes.recycle();
}
/**
* 图片设置
* @param img
* @param res
* @param size
*/
private void setImg(ImageView img,int res,int size){
// Log.i(img.getClass().getSimpleName(), "setImg: "+size);
ViewGroup.LayoutParams lp=img.getLayoutParams();
if(-1 == res){
lp.height=0;
lp.width=0;
img.setVisibility(GONE);
}else {
lp.height=size;
lp.width=size;
img.setImageResource(res);
img.setVisibility(VISIBLE);
}
img.setLayoutParams(lp);
}
/**
* 文字的设置
* @param tv
* @param text
* @param size
* @param color
*/
private void setTextView(TextView tv,String text,int size,int color){
// Log.i(tv.getClass().getSimpleName(), "setTextView: "+text+" "+size+" "+color);
tv.setText(text);
tv.setTextSize(size);
tv.setTextColor(color);
}
/**
* 用于修改 右侧文字,
* @param text
*/
public void setRightText(String text){
tv_right.setText(text);
}
}
3.在你的style文件中添加给控件使用的各种属性,这里有一点需要注意,这里的 declare-styleable的 name值要跟你的自定义view的类名一模一样
,不然当你在自己的布局文件中使用这个自定义控件的时候,系统不会提示自定义控件的各种属性,非常蛋疼,补充:后来才发现,这些属性最好放在res/values/attr.xml中,最好不要放在style文件里
<declare-styleable name="MeItem">
<attr name="leftImg" format="reference|integer"/>
<attr name="leftText" format="reference|string"/>
<attr name="rightText" format="reference|string"/>
<attr name="rightImg" format="reference|integer"/>
<attr name="leftImgSize" format="reference|dimension"/>
<attr name="leftTextSize" format="reference|dimension"/>
<attr name="rightImgSize" format="reference|dimension"/>
<attr name="rightTextSize" format="reference|dimension"/>
<attr name="leftTextColor" format="reference|color"/>
<attr name="rightTextColor" format="reference|color"/>
</declare-styleable>
4.使用:直接在布局文件中引用
<com.xunku.basetest.customView.MeItem
android:id="@+id/meItem"
android:layout_width="match_parent"
android:layout_height="50dp"
app:leftText="124"
app:rightText="13元"
app:rightImg="@mipmap/ic_launcher"
/>
注:各种format的值
reference:参考某一资源ID。
color:颜色值。
boolean:布尔值。
dimension:尺寸值。
float:浮点值。
integer:整型值。
string:字符串。
fraction:百分数。
enum:枚举值。
flag:位或运算。