今天要聊的是關於Edittext濾除位數的方法
我常常覺得喔...Edittext是個大坑
因著時代進步以及UI設計的崛起
現在的元件"防呆"功能要越來越強
而且又要考慮輸入失誤的處理跟如何顯示等
其實真的很煩= =''
今天的內容就是其中一個
這篇網誌以前有介紹過Android 中Edittext的一種名為TextWatcher的屬性
當時的教學重點是教你如何即時監控輸入並即時do something
這次的東西某些意義上是TextWatcher的精簡版(我覺得
但他的名稱(InputFilter)也講明白了,他就是拿來濾掉某些字或條件的
那就開始今天的功能及介紹
Github:
https://github.com/thumbb13555/EdittextFilterExample
1.畫介面:
介面非常簡單,就只有一個EditText
因為太少了我為了充版面,故直接放Layout上來吧XD
activity_main.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=".MainActivity">
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:digits="123456789.-"
android:ems="10"
android:hint="濾掉小數點特定位數"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.寫程式:
首先當然是先連結好介面元件,照我操作即可
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = findViewById(R.id.editText);
}
接下來是重點Σ(・口・),請在與onCreate同一層內加入InputFilter副程式
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = findViewById(R.id.editText);
editText.setFilters(new InputFilter[]{inputFilter});//將Filter綁定到指定的EditText上
}
private InputFilter inputFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
return null;
}
};
最後,加入過濾的程式
private InputFilter inputFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
/* source:偵測輸入內容
start:偵測輸入字的開始點
end:偵測输入字的结束點
dest:顯示當前顯示的內容
dstart:控制光標的開始位置
dent:控制光標的結束位置*/
if (dest.length() == 0 && source.equals(".")) {
return "0.";
}//如果使用者輸入"."則自動補為0.
String dValue = dest.toString();
String[] splitArray = dValue.split("\\.");//偵測小數點,若有則分割為兩個陣列
if (splitArray.length > 1) {
String dotValue = splitArray[1];
int dp = 3;//如果小數點後的陣列大於3(也就是限制3位)
if (dotValue.length() == dp) {
return "";
}
}
return null;
}
};
順便補上lambda的寫法
private InputFilter lambdaFilter = (source, start, end, dest, dstart, dend)->{
/* source:偵測輸入內容
start:偵測輸入字的開始點
end:偵測输入字的结束點
dest:顯示當前顯示的內容
dstart:控制光標的開始位置
dent:控制光標的結束位置*/
if (dest.length() == 0 && source.equals(".")) {
return "0.";
}
String dValue = dest.toString();
String[] splitArray = dValue.split("\\.");
if (splitArray.length > 1) {
String dotValue = splitArray[1];
int dp = 3;
if (dotValue.length() == dp) {
return "";
}
}
return null;
};
最後是全部
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = findViewById(R.id.editText);
editText.setFilters(new InputFilter[]{inputFilter});
}
private InputFilter inputFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
/* source:偵測輸入內容
start:偵測輸入字的開始點
end:偵測输入字的结束點
dest:顯示當前顯示的內容
dstart:控制光標的開始位置
dent:控制光標的結束位置*/
if (dest.length() == 0 && source.equals(".")) {
return "0.";
}
String dValue = dest.toString();
String[] splitArray = dValue.split("\\.");
if (splitArray.length > 1) {
String dotValue = splitArray[1];
int dp = 3;
if (dotValue.length() == dp) {
return "";
}
}
return null;
}
};
private InputFilter lambdaFilter = (source, start, end, dest, dstart, dend)->{
return null;
};
}
按下執行~
就可以看到想要的效果囉!(`・ω・´)+
結語:
今天這邊再提供了另一個針對EditText做限制的另一篇文章
希望對你有幫助~
另外,因為最近公司的要求,我幾項新的案子都會成用Kotlin寫
結論而言如果超過小數點三位,程式會直接砍掉所有已輸入的數字,我也不知道為什麼==
我就算Java+kotlin混搭也是一樣的結果...
這部分的話,就有待日後研究了(´・_・`)
那今天網誌寫到這,希望可以拯救各路好手的一天
留言列表