EidtText

简介: EidtText

概述

EditText是TextView的子类,因此TextView的一切xml属性同样也适用于EditText.

EidtText


像QQ一样输入表情图片

Demo:

public class InputTextAndPicAct extends Activity {
    private EditText et_input;
    private Button btn_insert;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input_text_and_pic);
        initView();
    }
    private void initView() {
        et_input = (EditText) findViewById(R.id.id_et_inputMess);
        btn_insert = (Button) findViewById(R.id.id_btn_insertPic);
    }
    /**
     * 在xml中配置了android:onClick属性,监听点击事件
     *
     * @param view
     */
    public void insertPic(View view) {
        // 随机产生1到10的整数
        int random = 1 + new Random().nextInt(10);
        LogUtils.d("随机产生的整数:" + random);
        try {
            // 根据随机产生的整数从R.drawable类中获取相应的资源ID的Field对象
            Field field = R.drawable.class.getField("gur_project_" + random);
            // 获取资源id,也就是静态变量的值
            int resourceId = Integer.parseInt(field.get(null).toString());
            // 根据资源ID获取图像的Bitmap对象
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
            // 根据Bitmap创建ImageSpan对象
            ImageSpan imageSpan = new ImageSpan(this,bitmap);
            // 创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
            String text = "gur_project_";
            SpannableString spannableString = new SpannableString(text);
            // 用ImageSpan替换gur-project-
            spannableString.setSpan(imageSpan,0,text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            // 将随机获取的图像追加到EditText控件后
            et_input.append(spannableString);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000">
    <EditText
        android:id="@+id/id_et_inputMess"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="#FFF"
        android:minLines="4"
        android:gravity="left|top"
        android:padding="10dp" />
    <Button
        android:id="@+id/id_btn_insertPic"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/id_et_inputMess"
        android:layout_margin="10dp"
        android:background="#FFF"
        android:padding="10dp"
        android:onClick="insertPic"
        android:text="随机插入表情" />
</RelativeLayout>


在<EditText>标签中我们设置了android:gravity的属性为left|top,以便输入的文本从左上角开始显示。因为设置了最小显示4行,如果不设置改属性,会从左侧中心位置开始显示,如果是单行就不会存在这个问题了。


我们将<Button>标签的android:onClick属性指定了单击事件的方法insertPic,在该方法中,随机获取gur_project_1到gur_project_10的任意一个资源的ID, 最常用的作法是将这个10个图片的资源ID放到一个数据里面,然后随机产生一个数组索引获取相应的资源ID,但是我们并没有采用这种方式,而是采用了直接通过反射技术从R.drawable类中获取图像资源ID的方法。 这种方法的好处是一旦图像非常的多,可以不需要在数组中逐个定义就可以获取到对应的资源ID了。


我们使用ImageSpan类来直接插入图像,当然了我们也可以采用<img>标签在EditText控件中插入图片,只是复杂一些,本案例没有采用。


注意事项:


由于R.drawable类中的资源ID都是public 的静态变量,因此我们可以直接使用Field.get方法获取这些变量的值。 如果是private或者protected类型的变量,需要field.setAccessible(true)来获取访问权限。

使用Field.get方法获取变量时,如果是静态变量,Field.get方法的参数可以设置为null即可,如果不是静态变量,则需要为Field.get方法指定一个变量所在类的对象作为参数值。

使用EditText类不能直接插入Span对象,因此需要先使用SpannableString对象来封装Span对象(例如本例中的ImageSpan对象),再将SpannableString对象插入到EditText控件中。


在EditText中输入特定的字符


EditText控件中可以通过多种方式指定允许输入的字符,比如指向输入0~9的数字

三种方式:

  • android:digits属性设置为0123456789
  • android:inputType属性设置为number
  • android:numeric设置为integer
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000"
    android:orientation="vertical"
    android:padding="10dp">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="#FFF"
        android:text="使用android:digits属性(输入数字)" />
    <EditText
        style="@style/bg_white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:digits="0123456789" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/bg_white"
        android:text="使用adnroid:digits属性输入26个英文小写字母"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/bg_white"
        android:digits="abcdefghijklmnopqrstuvwxyz"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="#FFF"
        android:text="使用android:inputType属性(输入数字)" />
    <EditText
        style="@style/bg_white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="#FFF"
        android:text="使用android:inputType属性(输入Email)" />
    <EditText
        style="@style/bg_white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress" />
</LinearLayout>
<!--
android 1.5以后添加了软件虚拟键盘的功能,所以在输入提示中将会有对应的软键盘模式
android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用。这也大大的方便的操作。有时需要虚拟键盘只为字符或只为数字。所以inputType尤为重要。
<EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="phone" />
//文本类型,多为大写、小写和数字符号。
android:inputType="none"
android:inputType="text"
android:inputType="textCapCharacters" 字母大写
android:inputType="textCapWords" 首字母大写
android:inputType="textCapSentences" 仅第一个字母大写
android:inputType="textAutoCorrect" 自动完成
android:inputType="textAutoComplete" 自动完成
android:inputType="textMultiLine" 多行输入
android:inputType="textImeMultiLine" 输入法多行(如果支持)
android:inputType="textNoSuggestions" 不提示
android:inputType="textUri" 网址
android:inputType="textEmailAddress" 电子邮件地址
android:inputType="textEmailSubject" 邮件主题
android:inputType="textShortMessage" 短讯
android:inputType="textLongMessage" 长信息
android:inputType="textPersonName" 人名
android:inputType="textPostalAddress" 地址
android:inputType="textPassword" 密码
android:inputType="textVisiblePassword" 可见密码
android:inputType="textWebEditText" 作为网页表单的文本
android:inputType="textFilter" 文本筛选过滤
android:inputType="textPhonetic" 拼音输入
//数值类型
android:inputType="number" 数字
android:inputType="numberSigned" 带符号数字格式
android:inputType="numberDecimal" 带小数点的浮点格式
android:inputType="phone" 拨号键盘
android:inputType="datetime" 时间日期
android:inputType="date" 日期键盘
android:inputType="time" 时间键盘
android:hint="" 是editText的一个提示 如:editText显示提示:请输入帐号! 当点击editText时这个文字会消失。
-->


当界面后面的EditText控件中的输入文本的时候会弹出系统软键盘,并且整个界面会上衣,以便显示当前正处于焦点的EditText,如果处于某种需要,不想让界面上移,可以使用getWindows().setSoftInputMode()将输入法模式设置为WindowManager,LayoutParamas.SOFT_INPUT_ADJSUT_RESIZE.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);


AutoCompleteTextView和MultiAutoCompleteTextView


AutoCompleteTextView是对EditText的扩展,它的父类是EditText.


使用AutoCompleteTextView标签

为AutoCompleteTextView设置adapter


public class AutoCompleteTextViewAct extends Activity {
    private AutoCompleteTextView actv ;
    private MultiAutoCompleteTextView mActv;
    private String[] array = new String[]{"周杰伦","周公举","周恩来","Google","Google Map","Google Android","Java"};;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auto_complete_text_view);
        initView();
        initViewMulti();
    }
    private void initView() {
        actv = (AutoCompleteTextView)findViewById(R.id.id_actv);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,array);
        actv.setAdapter(adapter);
    }
    private void initViewMulti() {
        mActv = (MultiAutoCompleteTextView) findViewById(R.id.id_actv_multi);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,array);
        mActv.setAdapter(adapter);
        // 指定多个字符串的分隔符为逗号
        mActv.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
    }
}


相关文章
|
6天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
179580 20
|
13天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
15天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
9329 23
|
19天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
4983 15
资料合集|Flink Forward Asia 2024 上海站
|
19天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
27天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
15天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
15天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
1148 71