心得感悟
这个Demo的确不难,但让自己写还是不能写出来。因为之前没有学过Android开发的一些方法控件,每次布置的Demo都写不出来,还是挺挫败的。而且因为开学事情有点多,预习任务也没能好好完成,心里有点浮躁,感觉自己落后了很多。希望接下来自己可以静下心跟上进度吧。
内容简概
- 一、 EditText入门
- 二、PIN解锁
- 三、效果预览
具体内容
一、 EditText入门
1.常用属性介绍
EditText(输入框)是一个常用的控件,和TextView的区别在于可以接收用户输入
。其常用属性如下:
属性 | 作用 |
---|---|
android:paddingLeft="" | 子控件(输入)边距 |
android:textColor="" | 输入文本的颜色 |
android:textSize="" | 输入文本的大小 |
android:hint="" | 提示文本 |
android:textColorHint="" | 提示文本的颜色 |
android:maxLines="" | 输入的最大行数 |
android:inputType="" | 输入内容的类型 |
android:maxLength="" | 输入的最大字符数 |
android:cursorVisible="" | 设置光标是否可见 |
android:imeOptions="" | 设置右下角的按键类型 |
2.简单例子
下面我们用以上属性做一个简单的界面
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@drawable/bg"
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:maxLength="6"
android:cursorVisible="false"
android:imeOptions="actionGo"
/>
</RelativeLayout>
public class MainActivity extends AppCompatActivity implements TextView.OnEditorActionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 通过id获取xml里对应的控件
EditText et = findViewById(R.id.et_password);
// 当前这个activity来监听事件
et.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
et.getText();
return false;
}
});
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int before, int count) {
}
/**
* CharSequence:显示的文本内容
* int start(i):0
* int before(i2):改变前字符数
* int count(i3):改变后字符数
*
* 限制输入个数为3个
*/
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
// 获取目前输入的个数
int len = charSequence.toString().length();
if (len > 6){
// 将最后一个删除
// 只要前面6 个
et.setText(charSequence.subSequence(1,6));
// 让光标定位到最后
et.setSelection(6);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
// 监听键盘被按下的回调事件
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
System.out.println("点击了");
return false;
}
}
由于密码保护,无法录制动态效果图,所以采用截图。
(1)没输入文本前:输入框有提示文本:“请输入密码”,光标被隐藏。
(2)输入任意文本后:提示消失,密码短暂时间显示内容,然后隐藏(变成圆点)。
(3)继续输入文本:最多只能输入6个字符。
这只是一个简单的例子,下面做一个更高阶一点的应用。
二、PIN解锁
1.主界面的xml文件
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<!--添加背景图片-->
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/main_bg" />
<!--文本提示框-->
<TextView
android:id="@+id/tv_alert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请设置密码"
android:textSize="@dimen/dimen_alert"
android:textColor="@color/colorGrey"
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/bg"
android:layout_centerHorizontal="true"
android:layout_below="@+id/tv_alert"
android:layout_marginTop="30dp"
android:paddingLeft="70dp"
android:textColor="@color/colorGrey"
android:textSize="@dimen/dimen_textView"
android:inputType="textPassword"
android:maxLength="6"
android:maxLines="1"
android:cursorVisible="false"
android:letterSpacing="0.5" />
</RelativeLayout>
2.主界面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
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 edit = sp.edit();
edit.putString("pwd",firstInput);
edit.commit();
// 跳转
goToNext();
}else {
// 密码不正确
mTextView.setText("两次密码不一致 请重新设置");
firstInput = null;
mEditText.setText("");
}
}
}else{
// 密码设置过了
if (inputPassword.equals(password)){
// 密码正确
mTextView.setText("密码正确!");
// 跳转
goToNext();
}else {
// 不正确
mTextView.setText("密码错误请重新输入");
// 清空
mEditText.setText("");
}
}
}
}
});
}
/**
* 跳转到下一个界面
* 四大组件
* 1.activity 界面
* 2.service 服务 后台做的事
* 3.contentProvider 内容提供者 不同程序间数据交互
* 4.broadcastReceiver 广播接收者 (通知)
*
* Intent 作为数据传递
* Intent:意图 (跳到哪个界面,要不要带数据)
*/
private void goToNext(){
// 创建一个Intent确定跳转的界面
// 1.显示意图 2.隐示意图 (系统界面)
Intent intent = new Intent(this,SecondActivity.class);
// 跳转
startActivity(intent);
}
}
3.跳转页面的xml文件
<?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=".SecondActivity"
android:background="@drawable/pic">
</androidx.constraintlayout.widget.ConstraintLayout>
4.跳转页面的Java代码
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 返回上一个界面(删除当前界面)
// 结束当前的activity
finish();
return true;
}
}
5.添加跳转页面
找到
value
,鼠标右击,按图中顺序操作完成创建。
6.添加自定义控件strings
同样找到value
,鼠标右击,按图中顺序操作完成创建。
三、效果预览
由于密码的保护机制,输入密码时录屏软件无法正常录制,只能放一个结尾的动图以及各部分截图。
顺序:第一次设置密码→两次输入不一致→设置密码成功→第二次登陆输入密码错误→输入密码正确