自定义控件添加自定义属性问题

  先提一下需求,用一个自定义EditText实现禁止输入表情。谈一下自定义控件中自定义属性的定义和使用方式。

  第一步当然是自定义类EditTextNoEmoji继承EditText,同时重写三个构造方法。这里需要注意的是,三个构造方法中必须分别实现父类对应的构造方法,就是三个super();而不能出现调用当前类的不同参数的另一个构造方法的形式,就是不能出现this()。否则的话,这个控件在实际使用时是获得不到焦点的,似乎是由于EditText继承TextView的原因,具体原因待查。

  谈谈这三个构造方法的区别,一参的构造EditTextNoEmoji(Context context),是在使用的java文件中动态生成时调用,两参的构造EditTextNoEmoji(Context context, AttributeSet attrs),是在使用的xml文件中静态生成时调用,三参的构造基本不会使用,暂且不讨论。而两参构造中的第二个参数attrs,正是我们要自定义的属性,所以在该方法中调用setAttrs(context, attrs)设置xml文件中使用到的自定义属性。

 1   public EditTextNoEmoji(Context context) {
 2         super(context);
 3     }
 4
 5     public EditTextNoEmoji(Context context, AttributeSet attrs) {
 6         super(context, attrs);
 7         setAttrs(context, attrs);
 8     }
 9
10     public EditTextNoEmoji(Context context, AttributeSet attrs, int defStyle) {
11         super(context, attrs, defStyle);
12         setAttrs(context, attrs);
13     }

  第二步需要声明自定义属性控制是否禁止输入表情,同时为了方便该控件在使用时的xml布局中配置该属性,要先在res/values/styles.xml中自定义属性名称。自定义属性的styleable名称必须是和自定义控件的类名保持一致的,在这个样式下可以添加任意的自定义属性,如下代码,添加了一个boolean类型的属性,名称为canInputEmoji。另外可以添加的属性类型包括 color,boolean,dimension,enum,flag,float,fraction,integer,reference,string等十种。这里定义的属性如下所示。

1 <declare-styleable name="EditTextNoEmoji"> 2 <attr name="canInputEmoji" format="boolean"/> 3 </declare-styleable>

  接下来要回到刚刚的EditTextNoEmoji类中继续写setAttrs(Context context, AttributeSet attrs)里边的内容了,接着看代码。

1      //自定义属性,控制是否输入表情
2     private boolean canInputEmoji;
3
4     private void setAttrs(Context context, AttributeSet attrs){
5         TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.EditTextNoEmoji);
6         canInputEmoji=typedArray.getBoolean(R.attr.canInputEmoji, false);
7     }

  上文提到如果在java文件中动态使用该控件,就是调用一参的构造,那上文的方式就不好使了,所以需要提供对该属性的封装,

1     public boolean canInputEmoji() {
2         return canInputEmoji;
3     }
4
5     public void setCanInputEmoji(boolean canInputEmoji) {
6         this.canInputEmoji = canInputEmoji;
7     }

  最后重写EditText的onTextChanged()方法即可,同时自定义属性在该方法中判断,代码如下。

 1     @Override
 2     protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
 3         super.onTextChanged(text, start, lengthBefore, lengthAfter);
 4         if(canInputEmoji()){
 5             int index = getSelectionStart() - 1;
 6             if (index > 0) {
 7                 if (isEmojiChar(text.charAt(index))) {
 8                     Editable edit = getText();
 9                     edit.delete(text.length() - 2, text.length());
10                 }
11             }
12         }
13     }

  下面贴上判断字符是否为表情字符的方法。

1    /**
2      * 判断字符是否是表情符号
3      * @param inputChar
4      * @return
5      */
6     private boolean isEmojiChar(char inputChar) {
7         return !((inputChar == 0x0) || (inputChar == 0x9) || (inputChar == 0xA) || (inputChar == 0xD) || ((inputChar >= 0x20) && inputChar <= 0xD7FF)) || ((inputChar >= 0xE000) && (inputChar <= 0xFFFD)) || ((inputChar >= 0x10000) && (inputChar <= 0x10FFFF));
8     }
时间: 2024-11-06 16:36:23

自定义控件添加自定义属性问题的相关文章

Java编程:向枚举添加自定义属性(用for-each循环来打印每种苹果的名称和价格)

package 枚举; //向枚举添加自定义属性 enum Apple { AURORA(10),BELMAC(12),CORTLAND(15),EMPIRE(8),GRAVENSTEIN(11); private int price; //构造方法 Apple(int price) { this.price = price; } int getPrice() { return price; } } public class ApplesEnum { public static void mai

Jquery获取select option动态添加自定义属性值失效

Jquery获取select option动态添加自定义属性值失效 2014/12/31 11:49:19 中国学网转载 编辑:李强 http://www.xue163.com/588880/39096/390963333.html 为了帮助网友解决“Jquery获取select optio”相关的问题,中国学网通过互联网对“Jquery获取select optio”相关的解决方案进行了整理,用户详细问题包括:jqueryselectie9  function GetFenceItemData(

添加自定义属性值及应用

添加自定义属性值: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>无标题文档</title> 6 <script> 7 window.onload = function (){ 8 var aBtn =

dedecms:织梦文章如何添加“自定义属性”标签(sql命令行工具)

dede织梦如何添加“自定义属性”标签“症状” 1.进入后台——系统——SQL命令行工具——运行SQL命令行,添加arcatt表字段: insert into`dede_arcatt`(sortid,att,attname) values(9,'d','症状') 2.添加archives表字段: alter table `dede_archives` modify `flag` set ('h','c','p','f','s','j','a','b','d') default NULL     

JavaScript: 高级技巧: window 对象也可以添加自定义属性

JavaScript: 高级技巧: window 对象也可以添加自定义属性 例如 window.ntName = 'a';例如 window.ntXw = top; 优点是, window 无须等加载完毕, 任何时候都可以调用, 如果是页面元素和变量, 就需要小姐加载完毕才能使用 例如在 lhg: 中 父页面dlg_XXX.ShowDialog(); dlg_XXX.inwin.nt调用父窗口 = window; 子页面alert( window.nt调用父窗口.location.href );

Android开发技巧——自定义控件之自定义属性

Android开发技巧--自定义控件之自定义属性 掌握自定义控件是很重要的,因为通过自定义控件,能够:解决UI问题,优化布局性能,简化布局代码. 上一篇讲了如何通过xml把几个控件组织起来,并继承某个ViewGroup子类,把它们封装起来使用.这是我们接触到的最简单的一种自定制控件了.但许多时候,我们还需要在布局文件中使用它们的时候,能通过属性传入一些值,来影响最终的显示结果. 我们在做项目中经常会遇到的一个情况:一张图片加一个文本的组合.比如充值账户成功之后显示的一个界面,上面是一个表示成功的

给html元素添加自定义属性,并且用jquery进行筛选

例如有多个div,想要实现类似radio的效果. <div name="teacher" selected="selected">tch1</div> <div name="teacher">tch1</div> <div name="teacher">tch1</div> <div name="student">stu1&

OpenLDAP添加自定义objectClass实现添加自定义属性

最近使用到OpenLDAP,需要集成进系统.但是OpenLDAP本身的模板中,能用的属性太少了,无法满足正常的业务需求,因此需要对条目的属性进行扩展. 确定的思路是新增自定义的objectClass,条目的objectClass添加该objectClass之后就可以合法添加自定义属性了(支持PhpLdapAdmin和ApacheDirectoryStudio等可视化工具) 但是能找到的相关的内容比较少,查到的比较多的也是直接添加schema然后在slapd.conf中引入.在服务器上试了一下(O

Android自定义控件之自定义属性的添加 -(2)

还是前面例子中的问题,如果想在xml中设置球的半径,应该怎么办?我们先了解下自定义属性的知识. 一.属性文件中format 首先我们要查看values目录下是否有attrs.xml,如果没有要创建一个. format可选项 reference //引用 color boolean dimension  /尺寸 float integer string fraction //百分数,如200% 下面再自定义几个属性,在attrs.xml文件中,如下 <?xml version="1.0&qu