EditText⽂本输⼊框——PIN解锁
目录
1.输入框:用于用户的输入
- EditText基本属性
- 监听事件
1.创建匿名类对象
2.当前这个Activity来监听 - 监听文本内容改变
详解
1.输入框:用于用户的输入
1.TextView 显示文本
2.PlainText
3.EditText
- EditText基本属性
EditText继承TextView,包含它的所有属性
margin:和服容器的间距
padding:控件内间距
textColor:输入颜色
textSize:显示尺寸
maxLines:最大行数
inputType:输入类型
hint:显示文本
textColorHint:显示文本颜色
实现:
<?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">
<!--
入框:用于用户的输入
1.TextView 显示文本
2.PlainText
3.EditText
margin:和服容器的间距
padding:控件内间距
-->
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="70dp"
android:background="@drawable/unlock"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:paddingLeft="70dp"
android:textColor="#ffffff"
android:textSize="30sp"
android:hint="请输入密码"
android:textColorHint="#999999"
android:maxLines="1"
android:inputType="textPassword"
android:cursorVisible="false"
android:imeOptions="actionGo"
/>
</RelativeLayout>
显示结果:
- 监听事件
1.创建匿名类对象
1.1 匿名对象
1.2 匿名类对象
1.3 Lambda表达式
public class MainActivity extends AppCompatActivity implements TextView.OnEditorActionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//id获取对应文件
EditText et=findViewById(R.id.et_password);
//1.1 匿名对象
/* xjtlistener pl=new xjtlistener();
et.setOnEditorActionListener (pl);*/
//1.2 匿名类对象
et.setOnEditorActionListener (new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
System.out.println("点击了");
return false;
}
});
//1.3 Lambda表达式
/*et.setOnEditorActionListener((textView,actionId,event)->
{
System.out.println("点击了");
return true;
});*/
class xjtlistener implements TextView.OnEditorActionListener {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
System.out.println("点击了");
return false;
}
}
2.当前这个Activity来监听
et.OnEditorActionListener (this);
//键盘按下的回调事件
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
System.out.println("点击了");
return false;
}
- 监听文本内容改变
et.addTextChangedListener(new TextWatcher() {
/**
*
* @param charSequence 显示文本内容
* @param i start 光标在最后,0
* 光标在中间,光标位置数
* @param i1 before 改变之前最后一个字符的位置
* @param i2 count 光标在最后,改变之后字符个数
* 光标在中间,改变的个数
* s:文本框中输入的所有文字 start:添加文字的位置 before:一直是0 count:此次添加文字的总个数
* s:之前的文字内容 start:添加文字的位置 count:一直是0 after:此次添加的文字总数(并不是输入框中的文字的总数)
* 光标在最后
* before<count:添加
* before>count:删除
*
* 限制输入的个数
*
*/
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
// System.out.println("改变前:"+et.getText().toString());
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
// System.out.println("正在改变:"+et.getText().toString());
//获取目前输入的个数
int len=charSequence.toString().length();
if (len>6){
//将最后一个删除
//只要前6个
et.setText(charSequence.subSequence(0,6));
//让光标定位到最后
et.setSelection(6);
}
}
@Override
public void afterTextChanged(Editable editable) {
// System.out.println("改变后:"+et.getText().toString());
}
});
}
练习——PIN解锁
1.设置密码
2.输入正确密码,跳转界面
解锁界面
<?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_alert"
android:textAlignment="center"
android:layout_marginTop="100dp"
/>
<!--添加文本输入框-->
<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:layout_below="@+id/tv_alert"
android:layout_marginTop="30dp"
android:paddingLeft="60dp"
android:textColor="@color/colorGray"
android:textSize="@dimen/dimen_textView"
android:inputType="textPassword"
android:maxLines="1"
android:maxLength="6"
android:cursorVisible="false"
/>
</RelativeLayout>
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(inputpassword)){
//两次密码一致
mTextView.setText("设置密码成功");
//保存密码
SharedPreferences.Editor editor=sp.edit();
editor.putString("pwd",firstInput);
editor.commit();
//跳转
gotoNext();
}else {
//密码不正确
mTextView.setText("两次密码不一致请重新设置");
firstInput=null;
mEditText.setText("");
}
}
}else {
//密码设置过了
if (inputpassword.equals(password)){
//密码正确
mTextView.setText("密码正确");
//跳转
gotoNext();
}else {
//不正确
mTextView.setText("密码错误请重新输入");
//清空
mEditText.setText("");
}
}
}
}
});
}
/**
* 跳转到下一个界面
* 4大组件
* 1.Activity 界面
* 2.Service 服务 后台做的事情
* 3.ContentProvider 内容提供者 不同程序间数据交互
* 4.BroadcastReceiver 广播接收者(通知)
*
* Intent作为数据传递枢纽
* 意图:跳到那个界面,要不要带数据
*/
private void gotoNext(){
//创建一个Intent确定跳转界面
//1.显示意图 2.隐示意图(系统界面)
Intent intent = new Intent(this,Main2Activity.class);
//跳转
startActivity(intent);
}
}
跳转界面
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".Main2Activity"
android:background="@color/colorAccent">
</androidx.constraintlayout.widget.ConstraintLayout>
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//返回上一个界面,删除当前界面,结束Main2Activity
finish();
return true;
}
}
下期内容
1.Button
形状 状态 事件监听
2.动画
补间 属性 关键帧
3.实现捂眼睛demo