今天要聊的是關於Edittext濾除位數的方法

我常常覺得喔...Edittext是個大坑

因著時代進步以及UI設計的崛起

現在的元件"防呆"功能要越來越強

而且又要考慮輸入失誤的處理跟如何顯示等

其實真的很煩= =''

 

今天的內容就是其中一個

這篇網誌以前有介紹過Android 中Edittext的一種名為TextWatcher的屬性

在這裡->http://thumbb13555.pixnet.net/blog/post/315696768-android-studio%e4%b9%8b-edittext%e5%8d%b3%e6%99%82%e7%9b%a3%e6%8e%a7%e8%bc%b8%e5%85%a5%e8%88%87%e9%99%90%e5%88%b6%e8%bc%b8%e5%85%a5%28

當時的教學重點是教你如何即時監控輸入並即時do something

這次的東西某些意義上是TextWatcher的精簡版(我覺得

但他的名稱(InputFilter)也講明白了,他就是拿來濾掉某些字或條件的

那就開始今天的功能及介紹

Gif_20200307153624893_by_gifguru

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副程式

截圖 2020-03-14 上午1.24.23

 @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混搭也是一樣的結果...

這部分的話,就有待日後研究了(´・_・`)

那今天網誌寫到這,希望可以拯救各路好手的一天

下載

 

 
arrow
arrow
    創作者介紹
    創作者 碼農日常 的頭像
    碼農日常

    碼農日常大小事

    碼農日常 發表在 痞客邦 留言(1) 人氣()