【Android程序开发】EditText详解

一、EditText介绍

EditText是一个输入框,在Android开发中是常用的控件。也是获取用户数据的一种方式。
EditTextTextView的子类,它继承了[TextView]的所有属性。

二、常用属性

属性 介绍
android:background="@drawable/bg" 设置背景(如果背景透明,则将@drawable/bg改为@null
android:layout_marginRight="50dp" 设置外间距
android:paddingLeft="80dp" 设置内间距
android:textColor = "#ff8c00" 设置字体颜色
android:textSize="30sp" 设置字体大小
android:hint="请输入密码" 设置显示在空间上的提示信息
android:textColorHint="#999999" 设置提示文本的颜色(默认为灰色)
android:lines=“1” 设置文本的行数,设置两行就显示两行,即使第二行没有数据
android:maxLines="1" 设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示
android:minLines=“1” 设置文本的最小行数,与lines类似
android:inputType="textPassword" 设置文本的类型,用于帮助输入法显示合适的键盘类型(此处键盘输出类型为“.....”)
android:maxLength="6" 限制显示的文本长度,超出部分不显示
android:imeOptions="actionGo" 附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号
android:textAlign="center" EditText没有这个属性,但TextView有,居中
android:singleLine="true" 设置单行输入,一旦设置为true,则文字不会自动换行
android:password="true" 设置只能输入密码
android:editable="true" 设置是否可编辑,true:可编辑 false:不可编辑
android:cursorVisible=false 设置光标显示(true)/隐藏(false)

三、常用方法

1.文本监听事件

editText.addTextChangedListener(new TextWatcher() {
 2     @Override
 3        public void onTextChanged(CharSequence text, int start, int before, int count) { 
 4        //text  输入框中改变后的字符串信息 
 5        //start 输入框中改变后的字符串的起始位置 
 6        //before 输入框中改变前的字符串的位置 默认为0 
 7        //count 输入框中改变后的一共输入字符串的数量 
 8             
 9        } 
10             
11        @Override
12        public void beforeTextChanged(CharSequence text, int start, int count,int after) { 
13        //text  输入框中改变前的字符串信息 
14        //start 输入框中改变前的字符串的起始位置 
15        //count 输入框中改变前后的字符串改变数量一般为0 
16        //after 输入框中改变后的字符串与起始位置的偏移量 
17           
18        } 
19      
20        @Override
21        public void afterTextChanged(Editable edit) { 
22        //edit  输入结束呈现在输入框中的信息 
23          
24        } 
25 });
使用:实现文本输入个数只有6个
et.addTextChangedListener(new TextWatcher() {
           @Override
           public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

           }
           @Override
           public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
               //获取目前输入的个数
               int len=charSequence.toString().length();
               if(len>6){
                   //将最后一个删除掉
                   //只要前面6个
                   et.setText(charSequence.subSequence(0,6));
                   //让光标定到最后
                   et.setSelection(6);
               }
           }

           @Override
           public void afterTextChanged(Editable editable) {
           }
       });
image.png

2.监听键盘事件的集中方式

  • 1.创建匿名类对象
1.1创建一个类管理事件
 PXDListener pl = new PXDListener();
 et.setOnEditorActionListener(pl);
//或
 et.setOnEditorActionListener(new PXDListener());
//创建一个类 管理事件的回调
class PXDListener implements TextView.OnEditorActionListener{
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        System.out.println("点击了");
        return false;
    }
}
1.2 匿名类对象
et.setOnEditorActionListener(new TextView.OnEditorActionListener() {
          @Override
          public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
              et.getText();
              return false;
          }
      });
1.3 Lambda表达式
et.setOnEditorActionListener((textView, actionId, event) -> {
            System.out.println("点击了");
            return true;
        });
  • 2.当前这个Activity来监听事件
public class MainActivity extends AppCompatActivity implements TextView.OnEditorActionListener {
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et.setOnEditorActionListener(this);
}
    //键盘被按下的回调事件
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        System.out.println("点击了");
        return false;
    }
}

四、练习-PIN解锁Demo

完整demo

Xml搭建界面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

<!--添加背景图片 -->
<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg"
    />
    <!--文本提示框-->
    <TextView
        android:id="@+id/tv_alert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请设置密码"
        android:textColor="@color/colorGray"
        android:textSize="@dimen/dimen_textView"
        android:textAlignment="center"
        android:layout_marginTop="80dp"/>
    <!--添加文本输入框-->
    <EditText
        android:id="@+id/et_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/unlock"
        android:layout_centerHorizontal="true"
        android:focusedByDefault="@id/tv_alert"
        android:layout_marginTop="30dp"
        android:paddingLeft="50dp"
        android:textColor="@color/colorGray"
        android:textSize="@dimen/dimen_textView"
        android:inputType="textPassword"
        android:maxLength="6"
        android:maxLines="1"
        android:cursorVisible="false"
        android:letterSpacing="0.5"
        />
</RelativeLayout>

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView mTextView;
    private EditText mEditText;
    private String password;
    private String firstInput;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取xml的控件
        mTextView=findViewById(R.id.tv_alert);
        mEditText=findViewById(R.id.et_password);

        Resources res=getResources();
        //通过这个对象获取string.xml里面对应的字符串
        String fileName=res.getString(R.string.password_file_name);
        //获取共享的sp对象:1.文件不存在就创建 2.文件存在就打开
        final SharedPreferences sp=getSharedPreferences(fileName,MODE_PRIVATE);
        //通过key获取对应的value
        password=sp.getString("pwd",null);


        //显示提示文本
        if(password==null){
            mTextView.setText("请设置密码");
        }else{
            mTextView.setText("请输入密码");
        }

        //监听内容改变的事件
        //观察者
        mEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
              //获取文本的内容
                String inputPassword=editable.toString();
                //判断是不是6个
                if(inputPassword.length()==6)
                {
                    if(password==null){
                        //设置密码
                        if(firstInput==null){
                            //设置密码的第一次
                            firstInput=inputPassword;
                            //提示请确认密码
                            mTextView.setText("请确认密码");
                            //清空密码
                            mEditText.setText("");

                        }else{
                            //确认密码
                            if(firstInput.equals(password)){
                                //密码正确
                                mTextView.setText("设置密码成功");
                                //保存密码
                                SharedPreferences.Editor edit=sp.edit();
                                edit.putString("pwd",firstInput);
                                edit.commit();
                                goToNext();
                            }else{
                                //密码不正确
                                mTextView.setText("两次密码不一致 请重新设置");
                                firstInput = null;
                                mEditText.setText("");
                            }
                        }
                    }else{
                        //密码设置过了
                        if(inputPassword.equals(password)){
                            //密码正确
                            mTextView.setText("密码正确!!");

                        }else{
                            //不正确
                            mTextView.setText("密码错误请重新输入");
                            //清空
                            mEditText.setText(" ");
                        }
                    }
                }
            }
        });

    }
运行效果
20190908_194523.gif
步骤解析
  • 导入图片素材

    image.png

  • colors.xml管理字体颜⾊

    image.png

  • dimens.xml管理尺寸数据-(在value里面新建一个dimens.xml管理尺寸数据)

新建dimens.xml
values->new->Values resource file->设置filename为dimens

image.png

image.png

  • 设置键盘⼀直显示-(PIN解锁界面中,当输入密码时,会有键盘弹出,但是要在点击一下界面后键盘才会出现,现要求键盘一直显示,不需要点击后再显示)

manifestsAndroidManifest.xml里面添加android:windowSoftInputMode="stateAlwaysVisible"

image.png

思考:如何在密码输入成功(即登录成功)后跳转到另一个界面,并从另一个界面跳转回去。^^
  • 1.创建下一个界面

创建一个新的界面
在java的第一个包里面鼠标右击新建->Activity->Empty Activity->设置一个Activity Name


image.png

  • 2.设置第二个界面的背景
image.png
  • 3.在MainActivity里面实现界面跳转
  • 4.点击屏幕实现返回
image.png

运行效果:

20190908_202133.gif
心得体会

今天上午没有拿眼镜,然后作为一个近视,很痛苦的上了一上午的课,然后上课就跟不上进度,难受。事实证明,要爱护好自己的视力

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容