当前位置: 移动技术网 > IT编程>移动开发>Android > Android 自定义View时使用TypedArray配置样式属性详细介绍

Android 自定义View时使用TypedArray配置样式属性详细介绍

2019年07月24日  | 移动技术网IT编程  | 我要评论

有奖活动网,江南大学教务系统,贴吧网

 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/包名

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网