发表于: 2018-10-07 23:26:33

0 604


一、今天完成的事情

       学习了如何自定义控件,做一个自定义的筛选菜单,最后运行的时候报了空指针的错误,暂时还没解决,不过倒是学了不少控件、布局方面的知识。

     1.自定义属性attrs.xml

        在vaues下创建一个attrs.xml文件,在declare-style able标签中直接定义属性,其中name一般设成自定义          控件的名称。在attr标签中,首先name是自定义属性的名称,format是属性的类型,常用类型有

      (1)  string:字符串类型;

      (2)  integer:整数类型;

      (3)  float:浮点型;

      (4)  dimension:尺寸;

      (5)  Boolean:布尔值;

      (6)  reference:引用类型,传入的是某一资源的ID,必须以“@”符号开头;

      (7)  color:颜色;

      (8)  fraction:百分比;

      (9)  enum:枚举类型

<?xml version="1.0" encoding="utf-8"?>
<resources>

   <declare-styleable name="DropDownMenu">
       <!--颜色——分割线-->
       <attr name="dividerColor" format="color"/>
       <!--颜色——半透明View-->
       <attr name="glassColor" format="color"/>
       <!--颜色——tab未被选中时的字体-->
       <attr name="textUnselectedColor" format="color"/>
       <!--颜色——tab被选中时的字体-->
       <attr name="textSelectedColor" format="color"/>
       <!--尺寸——筛选菜单的字体-->
       <attr name="menuTextSize" format="dimension"/>
       <!--图标——tab未被选中时的图标-->
       <attr name="tabUnselectedIcon" format="reference"/>
       <!--图标——tab被选中时的图标-->
       <attr name="tabSelectedIcon" format="reference"/>
   </declare-styleable>

</resources>

    

     2.获取自定义属性

...

   TypedArray ta = context.obtainStyledAttributes(attrsR.styleable.DropDownMenu);
   dividerColor = ta.getColor(R.styleable.DropDownMenu_dividerColor0xffffff);
   glassColor = ta.getColor(R.styleable.DropDownMenu_glassColor0x888888);

 

     3.setCompoundDrawablesWithIntrinsicBounds(left,  top, right, bottom)

      这是TextView 的方法,四个参数,分别对应左上右下,用来设置图片相对于文本内容的位置,如果不想在某个位置显示,就设为null,比如

tabTV.setCompoundDrawablesWithIntrinsicBounds(
null, null, null, getResources().getDrawable(tabUnselectedIcon));

     这就表示在文本下方显示图片。

    

    4.@Nullable和NotNull 注释

      这两个注解是用来标注方法是否能传入null值,如果可以传入NUll值,则标记为nullbale,如果不可以则标注为Nonnull. 在我们做了一些不安全严谨的编码操作的时候,这些注释会给我们一些警告,方便发现错误。


    5.TextView 的 setEllipsize属性

        参数END表明从文本开始截取view最大可以显示的宽度,不可见的部分将无法看到,也无法滑动span去查看。MARQUEE设置走马灯效果(常常配合setMarqueeRepeatLimit()使用),不用多说。参数START表示:取得文本的全部长度,不可见部分(即超出view部分)可以用手滑动span进行查看。

      比如

//当文本长度超过View时,截取view最大可以显示的宽度,不可见的部分将无法看到,也无法滑动span去查看
tabTV.setEllipsize(TextUtils.TruncateAt.END);

   

二、明天计划的事情

    实现相机的调用和图片的上传。


三、遇到的问题

    自定义控件中的LinearLayout调用addView()方法时

    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.addView(android.view.View)' on a null object reference

private LinearLayout tabMenuLL;
tabMenuLL = new LinearLayout(context);
//将tabTV添加到tabMenuLL
tabMenuLL.addView(tabTV);

      报错:tabMenuLL为空


四、收获

    学了一些控件、布局方面的知识。




返回列表 返回列表
评论

    分享到