1. 程式人生 > >Android初級教程

Android初級教程

只是一個簡單的Demo,EditText在Android中代表的往往是使用者的輸入結果,大多時候我們都直接getText獲取文字資料,進行使用,但是在一些場景之下我們就需要監聽EditText隨時隨地的變化,所以有addTextChangedListener的監聽模式,內建前中後三個週期,讓我們更加方便的使用和處理,下面請直接看Demo,非常簡單。

Effect 1:
這裡寫圖片描述

新手疑惑:
為什麼我們在onTextChanged中,進行了判空輸出,一開始沒有進行顯示?

答疑:
因為EditText的監聽是從你輸入開始算的,所以後面我們刪除資料的時候就顯示了我們之前判空的操作資料

  • 2017年 初版
    :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) { 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>