发表于: 2018-10-07 23:26:33
0 769
一、今天完成的事情
学习了如何自定义控件,做一个自定义的筛选菜单,最后运行的时候报了空指针的错误,暂时还没解决,不过倒是学了不少控件、布局方面的知识。
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(attrs, R.styleable.DropDownMenu);
dividerColor = ta.getColor(R.styleable.DropDownMenu_dividerColor, 0xffffff);
glassColor = ta.getColor(R.styleable.DropDownMenu_glassColor, 0x888888);
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为空
四、收获
学了一些控件、布局方面的知识。
评论