自定义view (一)自定义控件 viewGroup
来源:互联网 发布:java api文档下载 编辑:程序博客网 时间:2024/03/29 03:27
自定义一个包含了各种控件的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:位或运算。
0 0
- 自定义view (一)自定义控件 viewGroup
- 自定义控件(View viewGroup)
- Android自定义控件-完全自定义(继承View ,ViewGroup)
- androdi 自定义控件 ViewGroup(一)
- 自定义控件View(一)
- 自定义ViewGroup(一)
- 自定义ViewGroup(一)
- Android控件:自定义View和ViewGroup相关
- android控件架构、自定义View、ViewGroup
- 自定义控件View(一)
- 自定义View绘制心得(自定义view和自定义viewGroup)
- android自定义View(viewGroup)
- 自定义View及ViewGroup
- 自定义view,viewgroup
- 自定义View,ViewGroup,SurfaceView
- 自定义View、ViewGroup
- 自定义View,ViewGroup
- ViewGroup自定义View方法
- 【系分】论文案例、知识点总结
- java从入门到精通第六章数组笔记
- Deque实现队列
- assign copy retain 理解
- Servlet基础理论
- 自定义view (一)自定义控件 viewGroup
- 【面试题】c++有哪四个类型转换相关的关键字?
- 百度上传控件WebUploader介绍
- Linux挂载卸载硬盘
- VS2008中加载图片问题
- openfire之插件开发
- 清华山维软件EPS2012常用快捷键
- (两到三年)Java 面试精髓
- 基于IMOOC强力django+杀手级xadmin 打造上线标准的在线教育平台课程的学习(10)——Organization models.py的设计