Android初級教程
阿新 • • 發佈:2019-01-06
只是一個簡單的Demo,EditText在Android中代表的往往是使用者的輸入結果,大多時候我們都直接getText獲取文字資料,進行使用,但是在一些場景之下我們就需要監聽EditText隨時隨地的變化,所以有addTextChangedListener的監聽模式,內建前中後三個週期,讓我們更加方便的使用和處理,下面請直接看Demo,非常簡單。
Effect 1:
新手疑惑:
為什麼我們在onTextChanged中,進行了判空輸出,一開始沒有進行顯示?
答疑:
因為EditText的監聽是從你輸入開始算的,所以後面我們刪除資料的時候就顯示了我們之前判空的操作資料
- 2017年 初版
package com.example.dow.edittext;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText mEt;
private TextView mContent;
private TextView mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEt = (EditText) findViewById(R.id.et);
mContent = (TextView) findViewById(R.id.tv_content);
mBtn = (TextView) findViewById(R.id.tv_btn);
mEt.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) {
if(TextUtils.isEmpty(charSequence)){
mContent.setText("木有變,木有變");
}else{
mContent.setText("變化中,變化中");
}
}
@Override
public void afterTextChanged(Editable editable) {
mBtn.setText( mEt.getText().toString().trim());
}
});
}
}
- 2018年 修訂版(第一版) :MainActivity (主要解決使用者在輸入中,我們一直動態監聽,導致使用者還沒有輸完而出現的資料錯誤,此處和上方效果圖無關!!! )
package com.example.dow.edittext;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText mEt;
private TextView mContent;
private TextView mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEt = (EditText) findViewById(R.id.et);
mContent = (TextView) findViewById(R.id.tv_content);
mBtn = (TextView) findViewById(R.id.tv_btn);
mEt.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) {
//邏輯開始前,先移出監聽
mEt.removeTextChangedListener(this);
/**
* 在倆者區間進行邏輯處理,我這裡是計算金額出現的問題,這樣可以完美解決~
*/
//邏輯結束後,在加入監聽
mEt.addTextChangedListener(this);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
}
2018 修訂版(第二版)
場景:AB倆個EditText各自計算,且相互影響
出現問題:AB 因為相互影響,造成了死迴圈,導致記憶體溢位(簡稱:OOM)解決方案(以下程式碼,請看註釋)
關於程式碼中用到的工具,如您需要具體程式碼,可通過這裡進行檢視!常用小工具!
/**
* 首先要明白,關於監聽,一次建立,終身使用的概念
* 本文中keep2Decimal為設定使用者只可以輸入倆位小數
* ToolUtil.convertToDouble 為String轉double工具!
* ToolUtil.formatMoney(v1)為保留金錢格式
*/
//價格 A
AEditText.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) {
keep2Decimal(this, charSequence, AEditText);
}
@Override
public void afterTextChanged(Editable editable) {
//注意點1:這裡判斷有沒有獲取焦點至關重要!因為這樣才能有效的避免AB死迴圈的開始!!!
if (AEditText.hasFocus()) {
setPriceDate(1);
}
}
});
//價格 B
BEditText.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) {
keep2Decimal(this, charSequence, BEditText);
}
@Override
public void afterTextChanged(Editable editable) {
//注意點1:這裡判斷有沒有獲取焦點至關重要!因為這樣才能有效的避免AB死迴圈的開始!!!
if (BEditText.hasFocus()) {
setPriceDate(2);
}
}
});
/**
* 資料計算
*/
private void setPriceDate(int type) {
//這裡的totalAmount是我模擬的一個總價
double totalAmount = 100.00;
double v1 = totalAmount - ToolUtil.convertToDouble(ToolUtil.getText(AEditText), 0);
double v2 = totalAmount - ToolUtil.convertToDouble(ToolUtil.getText(BEditText), 0);
if (type == 1) {
BEditText.setText(ToolUtil.formatMoney(v1));
} else {
AEditText.setText(ToolUtil.formatMoney(v2));
}
}
MainActivity Xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context="com.example.dow.edittext.MainActivity">
<EditText
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et"
android:padding="8dp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:id="@+id/tv_content"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:id="@+id/tv_btn"
/>
</LinearLayout>