Android 自定义View时使用TypedArray配置样式属性详细介绍
程序员文章站
2024-03-02 15:20:16
android 自定义view时使用typedarray配置样式属性详细介绍
在自定义...
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_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" > <com.example.typedarraytest.expandtextview android:id="@+id/expand_text_view" style="@style/expandtextviewstyle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="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/包名
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!