Android EditText

来源:互联网 发布:淘宝已发货可以退款吗 编辑:程序博客网 时间:2024/05/15 20:43
EditText 文本输入框

下面实现一个登录页面

主要利用EditText实现:
 * 1.控制显示隐藏密码
 * 2.监听EditText改变事件
 * 3.控制EditText输入校验

main.xml 如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.kn_day03_3_edittext.MainActivity" >

    <TextView android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        
        android:layout_marginTop="30dp"
        android:layout_marginLeft="20dp"
        android:layout_marginStart="20dp"
        android:textSize="20sp"
        android:text="用户名:" />
    
    <TextView android:id="@+id/textview2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        
        android:layout_below="@+id/textview1"
        android:layout_alignRight="@+id/textview1"
        android:layout_alignEnd="@+id/textview1"
        android:layout_marginTop="20dp"
        android:textSize="20sp"
        android:text="密码:"/>
    <!-- 基线解释:书写英语单词时为了规范书写会设有四条线,从上至下第三条就是基线。
    基线对齐主要是为了两个控件中显示的英文单词的基线对齐。 -->

    <EditText android:id="@+id/edittext1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        
        android:layout_alignTop="@+id/textview1"
        android:layout_toRightOf="@+id/textview1"
        android:layout_toEndOf="@+id/textview1"
        android:layout_alignBaseline="@+id/textview1"
        android:layout_marginLeft="10dp"
        android:layout_marginStart="10dp"
        android:textSize="20sp"
        android:hint="用户名/邮箱/手机号"
        android:singleLine="true"
        android:ems="10">
        <!-- 请求焦点
获得焦点的输入框,默认光标闪烁,
默认弹出虚拟键盘
如果使用模拟器测试,不弹出虚拟键盘的解决方式:
如果是原生的模拟器~~确保模拟器创建的时候keyboard属性未勾选,
有勾选的不能显示虚拟键盘
如果第三方的模拟器~~打开Genymotion软件,找到模拟器,选择设置按钮,确保弹出窗口中
最下方的Uses Virtual keyboard for text input 选项有勾选上
 -->
        <requestFocus />
    </EditText>
    <!-- android:ems  设置EditText显示的时候默认的最小宽度
    属性值:任意数字      代表的是最少要达到n个字节那么宽
    
    android:hint属性用于设置输入框的默认提示
    此提示的特点在于:输入框中有文字的话,显示文字,不显示提示
    没有文字的话,就显示默认提示

    android:textColorHint="" 可以默认提示字体的颜色
    android:numeric=""  设置输入框仅输入数字
    属性值:
    signed   默认的
    integer  整数
    decimal  小数
    
    或者通过android:inputType="number"属性也可以去设置当前的输入框
    只能输入数字
    
    精确去限制输入框中输入的内容:
     android:digits  ,输入框只能输入该条属性属性值中包含的文字内容,
               如android:digits=“abc”则输入的值必须取自digits集合中的元素
    
    设置输入框显示方式是密码的形式的:
    android:password="true" 
    android:inputType = "textPassword"
     -->
    <EditText android:id="@+id/edittext2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        
        android:layout_toRightOf="@+id/textview2"
        android:layout_toEndOf="@+id/textview2"
        android:layout_alignTop="@+id/textview2"
        android:layout_alignBaseline="@+id/textview2"
        android:layout_marginLeft="10dp"
        android:layout_marginStart="10dp"
        android:hint="只能输入数字"
        android:inputType="number"
        android:digits="1234567890"
        android:password="true"
        android:singleLine="true"
        android:textSize="20sp" />
    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        
        android:layout_alignLeft="@+id/edittext2"
        android:layout_below="@+id/edittext2"
        android:layout_marginTop="30dp"
        android:onClick="login"
        android:text="登录" />
    <Switch
        android:id="@+id/switch1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textview2"
        android:layout_below="@+id/btn1"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="30dp"
        android:textOn="显示密码"
        android:textOff="隐藏密码"

        />
    <!-- 
    android:textOn="显示密码"  控制按钮在on状态的时候显示的文字内容
        android:textOff="隐藏密码" 控制按钮在off状态的时候显示的文字内容
     -->

</RelativeLayout>

EditText 的android:inputType属性有很多功能
<!-- android:inputType
功能:
大体上分3个方面
1.限制输入框中输入的内容
2.设置输入框中的内容显示的是密码的.
3.给弹出的虚拟键盘中添加一些针对某情况好用的按钮

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

MainActivity.java

package com.example.kn_day03_3_edittext;

import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.text.method.TransformationMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Switch;
/**
 * EditText学习
 * @author KNOWN
 * 要点:
 * 1.控制显示隐藏密码
 * 2.监听EditText改变事件
 * 3.控制EditText输入校验
 */
public class MainActivity extends Activity {

 EditText uname;
 EditText upwd;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 
  uname = (EditText)findViewById(R.id.edittext1);
  upwd = (EditText)findViewById(R.id.edittext2);
 
  Switch s = (Switch)findViewById(R.id.switch1);
  /**
   * 1.控制显示隐藏密码
   * 设置switch按钮状态改变的监听
   */
  s.setOnCheckedChangeListener(new OnCheckedChangeListener() {
   
   @Override
   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    // TODO Auto-generated method stub
    // 动态的改变输入框中密码的显示方式
    // 如果密码.的显示是通过布局文件中
    //android:password=“true”的属性实现的话
    /* 通过setTransformationMethod方法实现
     * HideReturnsTransformationMethod.getInstance() 代表获得一个对象,特点是:将.变成对应的文字 .->文字
     * PasswordTransformationMethod.getInstance()  获得一个对象,该对象的特点是:将文字变成. 文字->.
     */
    if (isChecked) {//显示密码被选中时执行
     Log.i("switch", "on");
     upwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
    } else {//隐藏密码被选中时执行
     Log.i("switch", "off");
     upwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
    }
    //如果在xml中使用的是inputtype去控制的密码显示
    /*if (isChecked) {  //显示密码
     upwd.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
    } else {   //隐藏密码
     upwd.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
    }*/
   }
  });
 
  //
  /**
   * 2.监听EditText改变事件
   * 添加--文本框改变监控事件  监控输入框中输入内容的变化
   * 注:当把鼠标点入输入框,到鼠标离开输入框,每输入一个字符都会出发内部的3个函数
   */
  upwd.addTextChangedListener(new TextWatcher() {
   
   /**
    * 文字正在改变的时候运行
    */
   @Override
   public void onTextChanged(CharSequence s, int start, int before, int count) {
    // TODO Auto-generated method stub
    Log.i("onTextChanged", "CharSequence s, int start, int before, int count:"+s+","+start+","+before+","+count);
   }
   
   /**
    * 内容改变前会运行的方法
    *
    */
   @Override
   public void beforeTextChanged(CharSequence s, int start, int count,
     int after) {
    // TODO Auto-generated method stub
    Log.i("beforeTextChanged", "harSequence s, int start, int count,int after:"+s+","+start+","+count+","+after);
   }
   
   /**
    * 文字改变后会运行的方法
    * s 参数对应改变后的文字
    */
   @Override
   public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    Log.i("afterTextChanged", "Editable s:"+s.toString());
    /*
     * 3.控制EditText输入校验
     * 需求:判断当前的输入框中输入的内容是否含有2,如果有的话,提示
     * */
    if(s.toString().contains("2")) {
     upwd.setError("文字里有2了");
    }
   }
  });
 }
 //登录事件
 public void login(View v){
  //验证用户名密码是否存在正确
  String name = uname.getText().toString();
  String pwd = upwd.getText().toString();
  /*
   * 连接数据库校验
   * ....
   */
  Log.i("login status", "login success!uname="+name+"&upwd="+pwd);
 }
 
}

0 0