• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 自定义控件添加自定义属性问题,控件添加自定义属性

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

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了为自定义控件添加事件,自定义控件添加属性,c#添加自定义控件,wpf 添加自定义控件,qt添加自定义控件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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


  先提一下需求,用一个自定义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     }

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-222.5.8 Notification(状态栏通知)详解
  • 2017-07-23Android设计模式(十六)-中介者模式
  • 2017-05-26翻翻git之---一个丰富的通知的工具库 NotifyUtil
  • 2017-05-26利用SurfaceView显示正弦曲线,仿造示波器,surfaceview正弦
  • 2017-05-26详解Android微信登录与分享,详解android分享
  • 2017-05-26Python安装setuptools遇到的MARKER_EXPR错误
  • 2017-05-26Android View体系(五)从源码解析View的事件分发机制
  • 2017-05-26在Android上,怎样与Kotlin一起使用Retrofit(KAD21),kotlinretrofit
  • 2017-05-26Android IPC 之 AIDL(一)
  • 2017-05-26cobbler系统使用之二高级篇的补充篇---关于kickstart文件内容的配置说明

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 手机产品设计之用户引导,手机产品设计引导
    • Android:支持多选的本地相册
    • Android 利用xUtils框架实现对sqllite的增删改查,xutilssqllite
    • 安卓第二天笔记-数据保存,安卓第二天笔记保存
    • Spider引擎分布式数据库解决方案(最全的spider教程)
    • Android Studio导入Eclipse项目的两种方法,androideclipse
    • Android5 Zygote 与 SystemServer 启动流程分析
    • android launchmode 使用场景
    • 静态变量的陷阱,静态变量陷阱
    • Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有