監(jiān)聽EditText

效果.gif
     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_40"
        android:layout_marginLeft="@dimen/dp_12"
        android:layout_marginRight="@dimen/dp_12"
        android:layout_marginTop="@dimen/dp_12"
        android:background="@drawable/bg_white"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:paddingLeft="@dimen/dp_10"
            android:text="消費金額:"
            android:textColor="@color/title_color"
            android:textSize="@dimen/sp_14" />

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/tv_buf"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginRight="@dimen/dp_10"
                android:gravity="center|right"
                android:text="¥"
                android:textColor="@color/shop_guige"
                android:textSize="@dimen/sp_20"
                android:visibility="gone" />

            <EditText
                android:id="@+id/dealMoney_et"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignParentRight="true"
                android:background="@null"
                android:gravity="right|center"
                android:inputType="number|numberDecimal"
                android:paddingLeft="@dimen/dp_5"
                android:paddingRight="@dimen/dp_10"
                android:textColor="@color/shop_guige"
                //@null表示和文字顏色一樣
                android:textCursorDrawable="@null"
                android:textSize="@dimen/sp_14" />

            <TextView
                android:id="@+id/tv_hint"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginRight="8dp"
                android:background="@null"
                android:gravity="right|center_vertical"
                android:text="@string/詢問服務(wù)員后輸入"
                android:textColor="@color/third_txt_color"
                android:textSize="@dimen/sp_14" />

        </FrameLayout>

    </LinearLayout>
screenshot-1510135622138.jpg

1.輸入過濾器InputFilter約束用戶輸入

public class CashierInputFilter implements InputFilter {
    Pattern mPattern;

    //輸入的最大金額
    private static final int MAX_VALUE = 100000;
    //小數(shù)點后的位數(shù)
    private static final int POINTER_LENGTH = 2;

    private static final String POINTER = ".";

    private static final String ZERO = "0";
    //只能輸入數(shù)字和小數(shù)點
    public CashierInputFilter() {
        mPattern = Pattern.compile("([0-9]|\\.)*");
    }

    /**
     * @param source 新輸入的字符串
     * @param start  新輸入的字符串起始下標,一般為0
     * @param end    新輸入的字符串終點下標,一般為source長度-1
     * @param dest   輸入之前文本框內(nèi)容
     * @param dstart 原內(nèi)容起始坐標,一般為0
     * @param dend   原內(nèi)容終點坐標,一般為dest長度-1
     * @return 輸入內(nèi)容
     */
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String sourceText = source.toString();
        String destText = dest.toString();

        //驗證刪除等按鍵
        if (TextUtils.isEmpty(sourceText)) {
            return "";
        }

        Matcher matcher = mPattern.matcher(source);
        //已經(jīng)輸入小數(shù)點的情況下,只能輸入數(shù)字
        if (destText.contains(POINTER)) {
            if (!matcher.matches()) {
                return "";
            } else {
                if (POINTER.equals(source.toString())) {  //只能輸入一個小數(shù)點
                    return "";
                }
            }

            //驗證小數(shù)點精度,保證小數(shù)點后只能輸入兩位
            int index = destText.indexOf(POINTER);
            int length = dend - index;

            if (length > POINTER_LENGTH) {
                return dest.subSequence(dstart, dend);
            }
        } else {
            /**
             * 沒有輸入小數(shù)點的情況下,只能輸入小數(shù)點和數(shù)字
             * 1. 首位不能輸入小數(shù)點
             * 2. 如果首位輸入0,則接下來只能輸入小數(shù)點了
             */
            if (!matcher.matches()) {
                return "";
            } else {
                if ((POINTER.equals(source.toString())) && TextUtils.isEmpty(destText)) {  //首位不能輸入小數(shù)點
                    return "";
                } else if (!POINTER.equals(source.toString()) && ZERO.equals(destText)) { //如果首位輸入0,接下來只能輸入小數(shù)點
                    return "";
                }
            }
        }

        //驗證輸入金額的大小
        double sumText = Double.parseDouble(destText + sourceText);
        if (sumText > MAX_VALUE) {
            return dest.subSequence(dstart, dend);
        }

        return dest.subSequence(dstart, dend) + sourceText;
    }
}
在Activity中的代碼
InputFilter[] filters = {new CashierInputFilter()};
etDealMoney.setFilters(filters);
NoConcessionsMoneyEd.setFilters(filters);

      /**
         * 監(jiān)聽消費金額的輸入
         */
        dealMoneyTv.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                conPrice = s.toString();
                int bg = TextUtils.isEmpty(s) ? R.drawable.selector_tuan__offer_to_pay_butn_bg : R.drawable.tuan_red_bag;
                SubmitButtonTv.setBackground(getResources().getDrawable(bg));
                SubmitButtonTv.setEnabled(TextUtils.isEmpty(s) ? false : true);
                dealWithMone(conPrice, notEnjoy);
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0) {
                    //設(shè)置不享受優(yōu)惠編輯框可以編輯
                    NoConcessionsMoneyEd.setMoneyIsEmpty(false);
                    //顯示消費金額的¥
                    tvBuf.setVisibility(View.VISIBLE);
                    //獲取EditText內(nèi)容長度
                    float textWidth = getTextWidth(dealMoneyTv);
                    //通過setX(float x)讓¥往左移動
                    tvBuf.setX(-textWidth);
                    //隱藏hint
                    tvHint.setVisibility(View.GONE);
                } else {
                    NoConcessionsMoneyEd.setMoneyIsEmpty(true);
                    tvBuf.setVisibility(View.GONE);
                    tvHint.setVisibility(View.VISIBLE);
                }
            }
      /**
         * 監(jiān)聽不享受優(yōu)惠金額的輸入
         */
        NoConcessionsMoneyEd.setOnFocusChangeListener((v, hasFocus) -> {
            //不享受優(yōu)惠金額的焦點
            noconcessionsFocus = hasFocus;
        });

        NoConcessionsMoneyEd.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //不享受優(yōu)惠金額
                notEnjoy = s.toString();
                if (!TextUtils.isEmpty(conPrice)) {
                    dealWithMone(conPrice, notEnjoy);
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0) {
                    //不享受優(yōu)惠金額¥顯示
                    tvSymbol.setVisibility(View.VISIBLE);
                    //獲取內(nèi)容長度
                    float textWidth = getTextWidth(NoConcessionsMoneyEd);
                    tvSymbol.setX(-textWidth);
                } else {
                    tvSymbol.setVisibility(View.GONE);
                }
            }
        });
不享受優(yōu)惠金額這里使用了自定義EditText
public class MyEditText extends EditText {
    /**
     * 消費金額是否為空
     * 默認為true
     */
    private boolean isEmpty = true;

    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new InputConnecttion(super.onCreateInputConnection(outAttrs), false);

    }

    /**
     * 消費金額是否為空
     *
     * @param isEmpty
     */
    public void setMoneyIsEmpty(boolean isEmpty) {
        this.isEmpty = isEmpty;
    }

    class InputConnecttion extends InputConnectionWrapper implements
            InputConnection {

        public InputConnecttion(InputConnection target, boolean mutable) {
            super(target, mutable);
        }

        /**
         * 對輸入的內(nèi)容進行攔截
         *
         * @param text
         * @param newCursorPosition
         * @return
         */
        @Override
        public boolean commitText(CharSequence text, int newCursorPosition) {
            // 當消費金額為空的時候進行攔截
            if (isEmpty) {
                ToastUtil.show("請先填寫消費金額");
                return false;
            }
            return super.commitText(text, newCursorPosition);
        }

        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            return super.sendKeyEvent(event);
        }

        @Override
        public boolean setSelection(int start, int end) {
            return super.setSelection(start, end);
        }
    }
}
/**
     * 獲取EditText的內(nèi)容寬度
     * @param editText
     * @return
     */
    private float getTextWidth(EditText editText) {
        TextPaint mTextPaint = editText.getPaint();
        return mTextPaint.measureText(editText.getText().toString());
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,734評論 25 708
  • 需求:有一個列表,列表中有一個edittext(只能輸整形),外部有一個整形變量Int,每次改變列表中其中一項的e...
    鍵盤上的麒麟臂閱讀 2,659評論 4 6
  • 簡介 使用ObservableField<T>來初始化變量,例如:var userPhone=Observable...
    Kotyo閱讀 5,138評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,826評論 18 139
  • b我把我的草帽留在了德國 我把我的草帽留在了德國。 2017年7月27日,我們一行人前往德國開始為期20天的歐洲游...
    猗璘館閱讀 269評論 0 0