AndroID 自定义view时使用TypedArray配置样式属性详细介绍
在自定义view时为了提高复用性和扩展性,可以为自定义的vIEw添加样式属性的配置,比如自定义图片资源、文字大小、控件属性等,就这需要用到TypedArray类,下面以一个自定义的可点击扩展和收缩的TextVIEw为例记录下这个类的简单使用。
先上效果图:
点击以后为
再贴代码:
1.自定义view类;
/** * @Title ExpandTextVIEw * @description 可扩展TextVIEw,可以通过设置ExpandTextVIEwStyle来自定义展开图片、收起图片和最小展示的行数 */ public class ExpandTextVIEw extends linearLayout implements OnClickListener { /** * 默认最少展示的行数 */ private int defaultMinlines; /** * 是否展开 */ private boolean mCollapsed = true; /** * 是否重新布局 */ private boolean mRelayout = false; private VIEw expandVIEw; private TextVIEw expandText; private ImageVIEw expandimg; private Drawable mExpandDrawable; private Drawable mCollapseDrawable; public ExpandTextVIEw(Context context) { this(context,null); } public ExpandTextVIEw(Context context,AttributeSet attrs) { super(context,attrs); init(attrs); } private voID init(AttributeSet attrs) { expandVIEw = LayoutInflater.from(getContext()).inflate( R.layout.pt__expand_textvIEw,null); expandText = (TextVIEw) expandVIEw.findVIEwByID(R.ID.expand_text); expandText.setonClickListener(this); expandimg = (ImageVIEw) expandVIEw.findVIEwByID(R.ID.expand_img); expandimg.setonClickListener(this); TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.ExpandTextVIEwStyle); // 自定义图片资源 mExpandDrawable = getResources().getDrawable( a.getResourceID(R.styleable.ExpandTextVIEwStyle_expand,R.drawable.pt__ic_expand)); expandimg.setBackgroundDrawable(mExpandDrawable); mCollapseDrawable = getResources().getDrawable( a.getResourceID(R.styleable.ExpandTextVIEwStyle_collapse,R.drawable.pt__ic_collapse)); // 自定义最小行数 defaultMinlines = a.getInt( R.styleable.ExpandTextVIEwStyle_default_min_lines,2); a.recycle(); linearLayout.LayoutParams params = new LayoutParams( LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER; addVIEw(expandVIEw,params); } @OverrIDe protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) { if (!mRelayout) { super.onMeasure(wIDthMeasureSpec,heightmeasureSpec); return; } mRelayout = false; expandText.setMaxlines(Integer.MAX_VALUE); expandimg.setVisibility(VIEw.GONE); super.onMeasure(wIDthMeasureSpec,heightmeasureSpec); if (expandText.getlineCount() <= defaultMinlines) { return; } if (mCollapsed) { expandText.setMaxlines(defaultMinlines); } expandimg.setVisibility(VIEw.VISIBLE); super.onMeasure(wIDthMeasureSpec,heightmeasureSpec); } public voID setText(CharSequence text) { mRelayout = true; expandText.setText(text); } public voID setText(int resID) { this.setText(getContext().getString(resID)); } @OverrIDe public voID onClick(VIEw vIEw) { if (expandimg.getVisibility() != VIEw.VISIBLE) { return; } mCollapsed = !mCollapsed; expandimg.setBackgroundDrawable(mCollapsed ? mExpandDrawable : mCollapseDrawable); expandText .setMaxlines(mCollapsed ? defaultMinlines : Integer.MAX_VALUE); } }
2.在res/values下添加的attrs.xml文件中定义样式属性;
<resources> <!-- ******************************可扩展ExpandTextVIEw样式******************************* --> <declare-styleable name="ExpandTextVIEwStyle"> <!-- 展开图片 --> <attr name="expand" format="reference" /> <!-- 关闭图片 --> <attr name="collapse" format="reference" /> <!-- 最小行数 --> <attr name="default_min_lines" format="integer" /> </declare-styleable> </resources>
3.在res/values下的style.xml文件中定义样式,可替换图片资源;
<!-- 可扩展ExpandTextVIEw样式 --> <style name="ExpandTextVIEwStyle"> <item name="expand">@drawable/pt__ic_expand</item> <item name="collapse">@drawable/pt__ic_collapse</item> <item name="default_min_lines">3</item> </style>
4.布局文件;
<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:custom="http://schemas.androID.com/apk/res/com.example.typedarraytest" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:paddingBottom="@dimen/activity_vertical_@R_502_5553@" androID:paddingleft="@dimen/activity_horizontal_@R_502_5553@" androID:paddingRight="@dimen/activity_horizontal_@R_502_5553@" androID:paddingtop="@dimen/activity_vertical_@R_502_5553@" > <com.example.typedarraytest.ExpandTextVIEw androID:ID="@+ID/expand_text_vIEw" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:layout_@R_502_5553@="8dp" custom:default_min_lines="2" /> </relativeLayout>
下面简单描述下实现步骤:
1.先定义好attrs.xml文件;
2.在自定义view类中获取定义的样式属性,下面这几行代码是关键:
TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.ExpandTextVIEwStyle); // 自定义图片资源 mExpandDrawable = getResources().getDrawable( a.getResourceID(R.styleable.ExpandTextVIEwStyle_expand,R.drawable.pt__ic_expand)); expandimg.setBackgroundDrawable(mExpandDrawable); mCollapseDrawable = getResources().getDrawable( a.getResourceID(R.styleable.ExpandTextVIEwStyle_collapse,R.drawable.pt__ic_collapse)); // 自定义最小行数 defaultMinlines = a.getInt( R.styleable.ExpandTextVIEwStyle_default_min_lines,2); a.recycle();
3.既可以直接在style.xml中定义样式然后使用,也可以在布局文件中配置属性:
custom:default_min_lines="2"
要使用上面的属性,需要在布局文件的根节点中添加如下属性:
xmlns:custom=http://schemas.androID.com/apk/res/com.example.typedarraytest
格式:xmlns:自定义关键字(用于在控件中使用属性,同androID)=http://schemas.androID.com/apk/res/包名
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
以上是内存溢出为你收集整理的Android 自定义View时使用TypedArray配置样式属性详细介绍全部内容,希望文章能够帮你解决Android 自定义View时使用TypedArray配置样式属性详细介绍所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)