【Android学习】自定义文本框和输入监听

实现功能

以上代码可实现功能:

1 自定义文本框样式

  1. 文本框触发形式转变

  2. 文本框输入长度监听,达到最大长度关闭软键盘

  3. password框触发检测phone框内容

1. drawable自定义形状

我创建了**editor_focus.xml 和 editor_unfocus.xml,**两者仅边界颜色不同

editor_focus.xml代码

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--    指定文本框内部颜色-->
    <solid android:color="#ffffff" />
    <!--    声明边界线颜色-->
    <stroke
        android:width="1dp"
        android:color="#0000ff" />
    <!--    使用圆角-->
    <corners android:radius="5dp" />
    <!--    指定形状四个方向的间距-->
    <padding
        android:bottom="2dp"
        android:left="2dp"
        android:right="2dp"
        android:top="2dp" />

</shape>

editor_unfocus.xml代码

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--    指定文本框内部颜色-->
    <solid android:color="#ffffff" />
    <!--    声明边界线颜色-->
    <stroke
        android:width="1dp"
        android:color="#888888" />
    <!--    使用圆角-->
    <corners android:radius="5dp" />
    <!--    指定形状四个方向的间距-->
    <padding
        android:bottom="2dp"
        android:left="2dp"
        android:right="2dp"
        android:top="2dp" />

</shape>

2. drawable自定义selector

selector的作用为不同的触发事件,编辑框有不同的形式。创建过程和上述shape创建过程类似,只是将shape改为 selector即可。

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/editor_focus" android:state_focused="true" />
    <item android:drawable="@drawable/editor_unfocus" />
</selector>

3. 创建 empty Activity

4.设置layout.xml

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical">

    <EditText
        android:id="@+id/et_phone"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@drawable/editor_selector"
        android:hint="请输入电话号码"
        android:maxLength="11"
        android:inputType="text"
        android:layout_marginTop="5dp"
        />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@drawable/editor_selector"
        android:hint="请输入密码"
        android:maxLength="6"
        android:inputType="textPassword"
        android:layout_marginTop="5dp"
        />

</LinearLayout>

5.Java代码

Activity

java 复制代码
package com.example.learn;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.example.learn.utils.ViewUtil;

public class EditerHideActivity extends AppCompatActivity implements View.OnFocusChangeListener{
    private EditText et_phone;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editer_hide);
        et_phone = findViewById(R.id.et_phone);
        EditText et_password = findViewById(R.id.et_password);
        //设置Text changeListener
        et_phone.addTextChangedListener(new HideTextWatch(et_phone,11));
        et_password.addTextChangedListener(new HideTextWatch(et_password,6));
        //设置password框focus时对phone自动检测
        et_password.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View view, boolean b) {
        //如果获取聚焦
        if(b){
            String str = et_phone.getText().toString();
            if(!"".equals(str) && str.length()<11){
                et_phone.requestFocus();
                Toast.makeText(this,"电话号码不足11位",Toast.LENGTH_SHORT).show();
            }
        }
    }

    private class HideTextWatch implements TextWatcher {
        private EditText mView;
        private int maxLen;
        public HideTextWatch(EditText v, int len) {
            this.mView = v;
            this.maxLen=len;
        }

        @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 str = editable.toString();
            //判断是否输入的字符串与maxLen一致
            //一致则关软键盘
            if(str.length() == this.maxLen){
                //EditerHideActivity.this 外部类的 activity
                //this:HideTextWatch
                ViewUtil.hideKeyboard(EditerHideActivity.this,mView);
            }
        }
    }
}

Util

java 复制代码
package com.example.learn.utils;

import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

public class ViewUtil {
    //当输入达到对应长度后 隐藏键盘
    public static void hideKeyboard(Activity act, View v){
        //从系统服务中获取输入法管理器
        InputMethodManager im = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        //将系统输入软件盘隐藏
        im.hideSoftInputFromWindow(v.getWindowToken(),0);
    }
}
相关推荐
王俊山IT12 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
wk灬丨28 分钟前
Android Kotlin Flow 冷流 热流
android·kotlin·flow
千雅爸爸29 分钟前
Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)
android
Mephisto.java1 小时前
【大数据学习 | kafka高级部分】kafka中的选举机制
大数据·学习·kafka
晨曦_子画1 小时前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
孤客网络科技工作室1 小时前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
武子康3 小时前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
Mr Lee_3 小时前
android 配置鼠标右键快捷对apk进行反编译
android
使者大牙3 小时前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型