Android学习之路(4) UI控件之输入框

news2024/11/25 5:00:49

本节引言:

在本节中,我们来学习第二个很常用的控件EditText(输入框); 和TextView非常类似,最大的区别是:EditText可以接受用户输入!

1.设置默认提示文本

如下图,相信你对于这种用户登录的界面并不陌生,是吧,我们很多时候都用的这种界面

相比另外这种,下面这种又如何?

还不赖是吧,当然,不会在这里贴布局,这里只介绍默认提示文本的两个控制属性:

默认提示文本的两个属性如下:

android:hint="默认提示文本"
android:textColorHint="#95A1AA"

前者设置提示的文本内容,后者设置提示文本的颜色!

2.获得焦点后全选组件内所有文本内容

当我们想在点击输入框获得焦点后,不是将光标移动到文本的开始或者结尾;而是 获取到输入框中所有的文本内容的话!这个时候我们可以使用selectAllOnFocus属性

android:selectAllOnFocus="true"

比如下面的效果图: 第一个是设置了该属性的,第二个是没设置该属性的,设置为true的EditText获得焦点后 选中的是所有文本!

3.限制EditText输入类型

有时我们可能需要对输入的数据进行限制,比如输入电话号码的时候,你输入了一串字母,这 显然是不符合我们预期的,而限制输入类型可以通过inputType属性来实现!

比如限制只能为电话号码,密码(textPassword):

<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"//时间键盘

4.设置最小行,最多行,单行,多行,自动换行

EditText默认是多行显示的,并且能够自动换行,即当一行显示不完的时候,他会自动换到第二行

我们可以对其进行限制,比如
设置最小行的行数:android:minLines=“3”
或者设置EditText最大的行数:android:maxLines=“3”
PS:当输入内容超过maxline,文字会自动向上滚动!!

另外很多时候我们可能要限制EditText只允许单行输入,而且不会滚动,比如上面的登陆界面的 例子,我们只需要设置

android:singleLine="true"

即可实现单行输入不换行

5.设置文字间隔,设置英文字母大写类型

我们可以通过下述两个属性来设置字的间距:

android:textScaleX="1.5"    //设置字与字的水平间隔
android:textScaleY="1.5"    //设置字与字的垂直间隔

另外EditText还为我们提供了设置英文字母大写类型的属性:android:capitalize 默认none,提供了三个可选值:

  • sentences:仅第一个字母大写
  • words:每一个单词首字母大小,用空格区分单词
  • characters:每一个英文字母都大写

6.控制EditText四周的间隔距离与内部文字与边框间的距离

我们使用margin相关属性增加组件相对其他控件的距离,比如android:marginTop = “5dp” 使用padding增加组件内文字和组件边框的距离,比如android:paddingTop = “5dp”

7.设置EditText获得焦点,同时弹出小键盘

关于这个EditText获得焦点,弹出小键盘的问题,前不久的项目中纠结了笔者一段时间 需求是:进入Activity后,让EditText获得焦点,同时弹出小键盘供用户输入! 试了很多网上的方法都不可以,不知道是不是因为笔者用的5.1的系统的问题! 下面小结下:

首先是让EditText获得焦点与清除焦点的

edit.requestFocus(); //请求获取焦点
edit.clearFocus(); //清除焦点

获得焦点后,弹出小键盘,笔者大部分时间就花在这个上:

低版本的系统直接requestFocus就会自动弹出小键盘了
稍微高一点的版本则需要我们手动地去弹键盘:

第一种:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

第二种:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);     imm.showSoftInput(view,InputMethodManager.SHOW_FORCED);  
imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘  

不知道是什么原因,上面这两种方法并没有弹出小键盘,笔者最后使用了:windowSoftInputMode属性解决了弹出小键盘的问题,这里跟大家分享下:

android:windowSoftInputMode Activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
这个属性能影响两件事情:
【一】当有焦点产生时,软键盘是隐藏还是显示
【二】是否减少活动主窗口大小以便腾出空间放软键盘

简单点就是有焦点时的键盘控制以及是否减少Act的窗口大小,用来放小键盘
有下述值可供选择,可设置多个值,用"|"分开
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
stateHidden:用户选择activity时,软键盘总是被隐藏
stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
stateVisible:软键盘通常是可见的
stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

我们可以在AndroidManifest.xml为需要弹出小键盘的Activity设置这个属性.

然后在EditText对象requestFocus()就可以了~

8.EditText光标位置的控制

有时可能需要我们控制EditText中的光标移动到指定位置或者选中某些文本!
EditText为我们提供了setSelection()的方法,方法有两种形式:

一个参数的是设置光标位置的,两个参数的是设置起始位置与结束位置的中间括的部分,即部分选中!
当然我们也可以调用setSelectAllOnFocus(true);让EditText获得焦点时选中全部文本!
另外我们还可以调用setCursorVisible(false);设置光标不显示
还可以调用getSelectionStart()和getSelectionEnd获得当前光标的前后位置

9.带表情的EditText的简单实现

相信大家对于QQ或者微信很熟悉吧,我们发送文本的时候可以连同表情一起发送,有两种简单的实现方式:

1.使用SpannableString来实现
2.使用Html类来实现
这里笔者用的是第一种,这里只实现一个简单的效果,大家可以把方法抽取出来,自定义一个EditText;
也可以自己动手写个类似于QQ那样有多个表情选择的输入框!

代码也很简单:

public class MainActivity extends Activity {
    private Button btn_add;
    private EditText edit_one;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_add = (Button) findViewById(R.id.btn_add);
        edit_one = (EditText) findViewById(R.id.edit_one);
        btn_add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                SpannableString spanStr = new SpannableString("imge");
                Drawable drawable = MainActivity.this.getResources().getDrawable(R.drawable.f045);
                drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
                ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE);
                spanStr.setSpan(span,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                int cursor = edit_one.getSelectionStart();
                edit_one.getText().insert(cursor, spanStr);
            }
        });
    }
}

PS:对了,别忘了放一个图片哦~

10.带删除按钮的EditText

当我们输入内容后,右面会出现这样一个小叉叉的图标,我们点击后会清空输入框中的内容!
实现起来其实也很简单:
为EditText设置addTextChangedListener,然后重写TextWatcher()里的抽象方法,这个用于监听输入框变化的;然后setCompoundDrawablesWithIntrinsicBounds设置小叉叉的图片;最后,重写onTouchEvent方法,如果点击区域是小叉叉图片的位置,清空文本!

实现代码如下:

public class EditTextWithDel extends EditText {

    private final static String TAG = "EditTextWithDel";
    private Drawable imgInable;
    private Drawable imgAble;
    private Context mContext;

    public EditTextWithDel(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public EditTextWithDel(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }

    public EditTextWithDel(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        init();
    }

    private void init() {
        imgInable = mContext.getResources().getDrawable(R.drawable.delete_gray);
        addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                setDrawable();
            }
        });
        setDrawable();
    }

    // 设置删除图片
    private void setDrawable() {
        if (length() < 1)
            setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
        else
            setCompoundDrawablesWithIntrinsicBounds(null, null, imgInable, null);
    }

    // 处理删除事件
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (imgInable != null && event.getAction() == MotionEvent.ACTION_UP) {
            int eventX = (int) event.getRawX();
            int eventY = (int) event.getRawY();
            Log.e(TAG, "eventX = " + eventX + "; eventY = " + eventY);
            Rect rect = new Rect();
            getGlobalVisibleRect(rect);
            rect.left = rect.right - 100;
            if (rect.contains(eventX, eventY))
                setText("");
        }
        return super.onTouchEvent(event);
    }
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【考研数学】概率论与梳理统计 | 第一章——随机事件与概率(1)

文章目录 一、随机试验与随机事件1.1 随机试验1.2 样本空间1.3 随机事件 二、事件的运算与关系2.1 事件的运算2.2 事件的关系2.3 事件运算的性质 三、概率的公理化定义与概率的基本性质3.1 概率的公理化定义3.2 概率的基本性质 写在最后 一、随机试验与随机事件 1.1 随机试验 …

ESG评级能否促进企业绿色转型(2009-2021年)

参照胡洁&#xff08;2023&#xff09;的做法&#xff0c;对来自数量经济技术经济研究《ESG评级能否促进企业绿色转型—基于多时点双重差分法的验证》一文中的基准回归部分进行复刻。 本文从非正式环境规制视角出发&#xff0c;基于商道融绿首次公布上市公司 ESG 评级的外生冲…

路径规划 | 详解维诺图Voronoi算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 维诺图规划原理2 ROS C实现(栅格图搜索)3 Python实现(路图搜索)4 Matlab实现(路图搜索) 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&#…

validation之自定义注解@Constraint

前言&#xff1a; 首先&#xff0c;接口参数校验应该都不陌生&#xff0c;大部分应该都会借助javax.validation进行快捷校验&#xff0c;一般都是在入参字段上添加NotNull、NotEmpty等&#xff0c;对于一些特殊的入参校验逻辑&#xff0c;可能不是很适用&#xff0c;现在介绍一…

Torch基本操作扫盲

torch.rand是均匀分布采样 torch.randn是标准正态分布采样 同时设定好了GPU种子 高斯/正态分布

强烈推荐一本讲IT管理的书

“真正的智慧不是知识&#xff0c;而是想象。” —— 阿尔伯特爱因斯坦 在这个信息化时代&#xff0c;IT行业以其巨大的生产力和创新力&#xff0c;深深地改变着每一个角落的生活和工作。而在这个行业里&#xff0c;IT运维无疑是一个至关重要的角色。然而&#xff0c;即使在IT界…

第二十一章 重要HL7操作场景 - HL7批量消息

文章目录 第二十一章 重要HL7操作场景 - HL7批量消息支持的批处理格式处理传入的批次文档批处理模式自定义出库批量处理 第二十一章 重要HL7操作场景 - HL7批量消息 Production品支持 HL7 中的嵌套子文档&#xff08;批处理格式&#xff09;。每个子文档本身就是一个虚拟文档。…

LeetCode 0617. 合并二叉树

【LetMeFly】617.合并二叉树 力扣题目链接&#xff1a;https://leetcode.cn/problems/merge-two-binary-trees/ 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而…

【代码随想录-Leetcode第六题:209. 长度最小的子数组】

209. 长度最小的子数组 题目思路代码实现 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回…

网络编程(TFTP协议实验)

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <head.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h>#define PORT 69 //端口号&#xf…

详谈MongoDB的那些事

概念区分 什么是关系型数据库 关系型数据库&#xff08;Relational Database&#xff09;是一种基于关系模型的数据库管理系统&#xff08;DBMS&#xff09;。在关系型数据库中&#xff0c;数据以表格的形式存储&#xff0c;表格由行和列组成&#xff0c;行表示数据记录&…

TypeScript 语法

环境搭建 以javascript为基础构建的语言&#xff0c;一个js的超集&#xff0c;可以在任何支持js的平台中执行&#xff0c;ts扩展了js并且添加了类型&#xff0c;但是ts不能被js解析器直接执行&#xff0c;需要编译器编译为js文件&#xff0c;然后引入到 html 页面使用。 ts增…

Python批量给excel文件加密

有时候我们需要定期给公司外部发邮件&#xff0c;在自动化发邮件的时候需要对文件进行加密传输。本文和你一起来探索用python给单个文件和批量文件加密。    python自动化发邮件可参考【干货】用Python每天定时发送监控邮件。 文章目录 一、安装pypiwin32包二、定义给excel加…

推荐几款流行的项目管理系统,助力高效团队协作!

项目式管理是目前非常流行的企业管理方法&#xff0c;这种方法让是如何在确保时间、技术、经费和性能指标的条件下&#xff0c;以尽可能高的效率完成预定目标&#xff0c;让所有与企业相关方满意。在这种模式下&#xff0c;团队的层次关系不再那么重要&#xff0c;大家以项目结…

第一百二十八天学习记录:数据结构与算法基础:栈和队列(上)(王卓教学视频)

栈和队列的定义和特点 1、栈和队列是两种常用的、重要的数据结构 2、栈和队列是限定插入和删除只能在表的“端点”进行的线性表 线性表可以在任意一个位置插入和删除&#xff0c;栈只能在最后位置插入和删除 队列 只能删除第一个元素 栈和队列是线性表的子集&#xf…

测试开发探索:“WeTalk“网页聊天室的测试流程与自动化

目录 引言&#xff1a; 测试开发目标&#xff1a; "WeTalk"项目背景 关于登录测试用例的设计 测试开发策略与流程 集成测试&#xff1a;Selenium JUnit 接口测试&#xff1a;Postman 测试用例的设计与实现 自动化测试演示&#xff1a; 用例一&#xff1a;登…

【Linux操作系统】深入理解Linux系统编程中的传入参数、传出参数和传入传出参数

在Linux系统编程中&#xff0c;函数的参数扮演着至关重要的角色。参数的传递方式可以分为传入参数、传出参数和传入传出参数。本文将详细解释这三种参数的概念、特点以及如何使用它们来实现灵活和高效的函数调用和数据传递。 文章目录 1. 解释和举例1.1 传入参数&#xff08;i…

案例15 Spring Boot入门案例

1. 选择Spring Initializr快速构建项目 ​ 2. 设置项目信息 ​ 3. 选择依赖 ​ 4. 设置项目名称 ​ 5. 项目结构 ​ 6. 项目依赖 自动配置了Spring MVC、内置了Tomcat、配置了Logback(日志)、配置了JSON。 ​ 7. 创建HelloController类 com.wfit.boot.hello目录下创建HelloCo…

NO.3 MyBatis获取参数的两种方式

目录 1、两种方式的区别 2、单个字面量类型的参数 2.1 在映射文件中&#xff0c;用#{}加任意名称获取参数的值&#xff1a; 2.2 在映射文件中&#xff0c;用${}加任意名称获取参数的值&#xff1a; 2.3 小结 3、在map集合类型的参数 3.1 使用MyBatis默认的map映射集合 …

delphi11中的自动启动和关闭unigui应用服务器

1、设置。 注意&#xff1a;全部。 taskkill /f /im $(OUTPUTFILENAME) 2>1 || exit /B 0 自动运行chrome打开unigui网页 unit ServerModule;interfaceuses Winapi.ShellAPI, vcl.Dialogs;typeTUniServerModule class(TUniGUIServerModule)procedure UniGUIServerModu…