EditText?本輸?框——PIN解鎖
目錄
1.輸入框:用于用戶的輸入
- EditText基本屬性
- 監(jiān)聽事件
1.創(chuàng)建匿名類對象
2.當(dāng)前這個Activity來監(jiān)聽 - 監(jiān)聽文本內(nèi)容改變
詳解
1.輸入框:用于用戶的輸入
1.TextView 顯示文本
2.PlainText
3.EditText
- EditText基本屬性
EditText繼承TextView文兑,包含它的所有屬性
margin:和服容器的間距
padding:控件內(nèi)間距
textColor:輸入顏色
textSize:顯示尺寸
maxLines:最大行數(shù)
inputType:輸入類型
hint:顯示文本
textColorHint:顯示文本顏色
實現(xiàn):
<?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:控件內(nèi)間距
-->
<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>
顯示結(jié)果:
- 監(jiān)聽事件
1.創(chuàng)建匿名類對象
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獲取對應(yīng)文件
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.當(dāng)前這個Activity來監(jiān)聽
et.OnEditorActionListener (this);
//鍵盤按下的回調(diào)事件
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
System.out.println("點擊了");
return false;
}
- 監(jiān)聽文本內(nèi)容改變
et.addTextChangedListener(new TextWatcher() {
/**
*
* @param charSequence 顯示文本內(nèi)容
* @param i start 光標(biāo)在最后形入,0
* 光標(biāo)在中間霜医,光標(biāo)位置數(shù)
* @param i1 before 改變之前最后一個字符的位置
* @param i2 count 光標(biāo)在最后旋讹,改變之后字符個數(shù)
* 光標(biāo)在中間盯质,改變的個數(shù)
* s:文本框中輸入的所有文字 start:添加文字的位置 before:一直是0 count:此次添加文字的總個數(shù)
* s:之前的文字內(nèi)容 start:添加文字的位置 count:一直是0 after:此次添加的文字總數(shù)(并不是輸入框中的文字的總數(shù))
* 光標(biāo)在最后
* before<count:添加
* before>count:刪除
*
* 限制輸入的個數(shù)
*
*/
@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());
//獲取目前輸入的個數(shù)
int len=charSequence.toString().length();
if (len>6){
//將最后一個刪除
//只要前6個
et.setText(charSequence.subSequence(0,6));
//讓光標(biāo)定位到最后
et.setSelection(6);
}
}
@Override
public void afterTextChanged(Editable editable) {
// System.out.println("改變后:"+et.getText().toString());
}
});
}
Android 文本監(jiān)聽接口TextWatcher詳解
練習(xí)——PIN解鎖
1.設(shè)置密碼
2.輸入正確密碼尚洽,跳轉(zhuǎn)界面
解鎖界面
<?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="請設(shè)置密碼"
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里面的對應(yīng)字符串
String Filename=res.getString(R.string.password_file_name);
//獲取共享的sp對象:1.文件不存在就創(chuàng)建
// 2.文件存在就打開
final SharedPreferences sp=getSharedPreferences(Filename,MODE_PRIVATE);
//通過key獲取對應(yīng)的value
password=sp.getString("pwd",null);
//顯示提示文本
if (password==null){
mTextView.setText("請設(shè)置密碼");
}else {
mTextView.setText("請輸入密碼");
}
//監(jiān)聽內(nèi)容改變的事件
//觀察者
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) {
//獲取文本內(nèi)容
String inputpassword = editable.toString();
//判斷是不是6個
if (inputpassword.length()==6){
//判斷是不是設(shè)置密碼
if (password == null){
//設(shè)置密碼
if (firstInput==null){
//設(shè)置密碼的第一次輸入
firstInput=inputpassword;
//提示確認密碼
mTextView.setText("請確認密碼");
//清空內(nèi)容
mEditText.setText("");
}else {
//確認密碼
if (firstInput.equals(inputpassword)){
//兩次密碼一致
mTextView.setText("設(shè)置密碼成功");
//保存密碼
SharedPreferences.Editor editor=sp.edit();
editor.putString("pwd",firstInput);
editor.commit();
//跳轉(zhuǎn)
gotoNext();
}else {
//密碼不正確
mTextView.setText("兩次密碼不一致請重新設(shè)置");
firstInput=null;
mEditText.setText("");
}
}
}else {
//密碼設(shè)置過了
if (inputpassword.equals(password)){
//密碼正確
mTextView.setText("密碼正確");
//跳轉(zhuǎn)
gotoNext();
}else {
//不正確
mTextView.setText("密碼錯誤請重新輸入");
//清空
mEditText.setText("");
}
}
}
}
});
}
/**
* 跳轉(zhuǎn)到下一個界面
* 4大組件
* 1.Activity 界面
* 2.Service 服務(wù) 后臺做的事情
* 3.ContentProvider 內(nèi)容提供者 不同程序間數(shù)據(jù)交互
* 4.BroadcastReceiver 廣播接收者(通知)
*
* Intent作為數(shù)據(jù)傳遞樞紐
* 意圖:跳到那個界面缤底,要不要帶數(shù)據(jù)
*/
private void gotoNext(){
//創(chuàng)建一個Intent確定跳轉(zhuǎn)界面
//1.顯示意圖 2.隱示意圖(系統(tǒng)界面)
Intent intent = new Intent(this,Main2Activity.class);
//跳轉(zhuǎn)
startActivity(intent);
}
}
跳轉(zhuǎn)界面
<?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) {
//返回上一個界面,刪除當(dāng)前界面,結(jié)束Main2Activity
finish();
return true;
}
}
下期內(nèi)容
1.Button
形狀 狀態(tài) 事件監(jiān)聽
2.動畫
補間 屬性 關(guān)鍵幀
3.實現(xiàn)捂眼睛demo