Android 關于TextView與EditText的一些使用小技巧

開寫前的一些話語

本人從事Android開發,約莫有一年時間,關于這兩個TextView和EditText,這兩個常用控件,在大學期間,只有少量的接觸,起初覺得還挺簡單的,后來在開發中遇到相應的問題,才覺得這兩個常用的東西,還是有很多門道的,特此寫一小份帖子,供給他人取用。

1.TextView

關于這個控件,我分享一些它的相關屬性使用,方便大家在自己的項目開發中使用。

1.1增加顯示效果

1.1.1TextView.setStrikeThruText(boolean strikeThruText)        這個方法,代表是否加刪除線

1.1.2TextView.setUnderlineText(boolean underlineText)        這個方法,代表是否設置下劃線

1.1.3TextView.setFakeBoldText(boolean fakeBoldText)        這個方法,代表是否設置粗體

1.1.4.TextView.getPaint().setAntiAlias(boolean antiAlias);        這個方法,代表是否開啟抗鋸齒效果

1.2增加圖形設置

布局中,通過drawableLeft,drawableRight,drawableTop,drawableBottom屬性,在文字的上下左右,設置對應的圖片

代碼中,可以通過TextView..setCompoundDrawables(null, null, null, null)來設置

值得注意的是,方法內設置為null,即取消對應方位的圖片,一行代碼足矣

若是要在代碼中,主動設置圖片,則需要加一行:

drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());

如此做,應該是為了設置放置圖片的寬高,否則的話,高0,寬0的圖片設置進來,便沒有效果

完整代碼如下:

Drawable drawable=ContextCompat.getDrawable(R.drawable.icon);    //比getResources方法,更加通用

drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());

TextView.setCompoundDrawables(null, null, drawable, null);

1.3代碼中設置TextView的長度與內容

舉例:

如以下代碼,number代表區號,mobile代表手機號,因區號和手機號的長度不定,且是從上一個頁面傳過來的,為了在這個頁面顯示,突出其顏色值,可以按照以下代碼操作,利用首尾文字是固定的特點,利用SpannableStringBuilder與ForegroundColorSpan,去設置截取中間一段,有關于帶區號手機號碼的數字:


String s = "我們已經給手機號碼" + number + " " + mobile + "發送了一個4位數的驗證碼";

TextView.setText(s);

SpannableStringBuilder builder = new SpannableStringBuilder(TextView.getText().toString());

ForegroundColorSpan span = new ForegroundColorSpan(Color.rgb(255, 102, 0));

builder.setSpan(span, 9, s.length() - 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

TextView.setText(builder);

1.4TextView與定時器的結合

舉例:


    private int   nTimer = 0;
    private Timer timer  = null;
    TimerTask timeTask = null;

    private void startTimeCountdown() {
        nTimer = 60;
        updateCountdownButtonUI();
        timer = new Timer();
        timeTask = new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(1);
            }

        };

        timer.schedule(timeTask, 1000, 1000);
    }

    private void stopTimeCountdown() {
        if (timeTask != null) {
            timeTask.cancel();
            timeTask = null;
        }
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
        nTimer = 0;
        updateCountdownButtonUI();
    }

    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                nTimer--;
                if (nTimer == 0) {
                    stopTimeCountdown();
                } else
                    updateCountdownButtonUI();
            }

            super.handleMessage(msg);
        }
    };

    private void updateCountdownButtonUI() {
        if (nTimer > 0) {
            TextView.setText("重新發送(" + String.format("%d", nTimer) + ")");
            TextView.setTextColor(Color.rgb(189, 189, 189));
            TextView.setEnabled(false);
        } else {
             TextView.setText("重新發送");        //.setText()是設置TextView內容的方法
             TextView.setTextColor(Color.rgb(255, 102, 0));        //.setTextColor()是設置TextView顏色的方法
             TextView.setEnabled(true);        //setEnabled()是設置TextView是否可以響應觸摸事件
        }
    }

以上代碼,從進入這個頁面后,在protected void onCreate(Bundle savedInstanceState){},便調用startTimeCountdown();方法,即可將TextView置為不可點擊,且初始60秒,會在定時器的作用下,開始倒數,每隔一秒鐘,數字減1,直到mTime不在大于零,便改變TextView的文字、顏色,以及讓其可點擊。

而在再度點擊完按鈕后,除了請求接口發送短信以外,在調用startTimeCountdown();方法,便可以實現循環。

如此一來,一個限時一分鐘,才能發送一次的短信驗證碼TextView,就實現了。

注:setEnabled() 和 setClickable():

這兩個方法是有區別的

前者,setEnabled()設置為false,包括觸摸事件,都不會被響應

后者,setClickable()設置為false,還可以響應觸摸事件,且在源碼中,若是調用setOnclickListener()方法,會自動把setClickable()從false置為true

2.EditText

2.1關于EditText的一些基礎設置

2.1.1下劃線的設置

在布局中,可以設置android:background="@null",這是代表去掉下劃線的

若是你想要設置不同顏色的下劃線,改變這個參數的設置即可。

2.1.2設置光標顏色

可以在布局中,設置這個參數android:textCursorDrawable

2.1.3獲取焦點


EditText.setFocusable(true);

EditText.setFocusableInTouchMode(true);

EditText.requestFocus();

2.2inputtype屬性

指代的是,edittext控件,可輸入的類型,種類有很多,下面列舉最常用的幾種:

android:inputType="text"http://輸入類型為普通文本

android:inputType="number"http://輸入類型為數字文本

android:inputType=”phone”//輸入類型為電話號碼

android:inputType="textPassword"http://輸入一個密碼

注:代碼中也可設置

配合checkbox等控件,可以實現類似于密碼的顯示與隱藏效果,代碼如下:

    public void onHideOrShow() {
        if (hide_or_show.isChecked()) {
            et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
            et_password.setSelection(et_password.getText().length());
        } else {
            et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            et_password.setSelection(et_password.getText().length());    //可讓在點擊切換的過程中,光標一直處于末尾處
        }
    }

效果如下圖:

image
image

2.3禁用復制粘貼功能

Android SDK 23 即6.0以前,想要禁用EditText的復制粘貼功能,只需:EditText.setLongClickable(false);禁用其長按點擊事件即可

Android SDK 23 即6.0以后,光是禁用EditText的長按點擊事件,還不夠:

還需:

       et.setCustomInsertionActionModeCallback(new ActionMode.Callback() {
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {

            }
        });

注:因為這個方法,是6.0以后才出現的,為了避免報java.lang.NoSuchMethodError:的錯誤,考慮到兼容性,使用這個監控方法前,最好是做一個判斷,即:


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

……

}

2.4輸入長度的限制

若是想要限制EditText所能夠輸入的長度,可以在代碼或布局中設置相關屬性,即:

布局中,設置android:maxLength=""

代碼中,設置editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(???)});

完了么?

并沒有。

上述方法,在大多數情況下,已經可以適用了。

可若是遇上可以輸入中文的地方,且還需要限制,比如說,設置昵稱時,以上方法,就不夠用了。

因為,在計算機底層語言中,一個漢字是等于兩個字符的,但,實際情況,在edittext的輸入過程中,漢字與字母、數字的比例,仍是一比一比一

為了匹配一些要求,比如說昵稱輸入,可以監控.addTextChangedListener方法,如下代碼所示:

舉例:

 final Pattern pa = Pattern.compile("^[\\u4e00-\\u9fa5]*$");      //匹配漢字的正則表達式
        et_nick.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) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                String temp = et_nick.getText().toString();
                char[] textChar = temp.toCharArray();
                int num = 0;
                for (int i = 0; i < temp.length(); i++) {
                    if ((pa.matcher(textChar[i] + "")).find()) {
                        num += 2;
                    } else {
                        num += 1;
                    }
                    if (num >= 17) {
                        if (num == 18 || num == 17) {
                            et_nick.setText(temp.substring(0, i));
                            Toast.makeText(mContext, "昵稱最多輸入8個漢字或16個字符", Toast.LENGTH_SHORT).show();
                        } else {
                            //Log.e("TAG",num+"----------------------");
                        }
                        break;
                    }
                }
                et_nick.setSelection(et_nick.getText().length());
            }
        });

2.5軟鍵盤的調取和關閉

在一些頁面,需要在一進來時,便獲取EditText的焦點,并彈出軟鍵盤,要實現這個效果,需要在AndroidManifest.xml做相關的配置,即:

    <activity
            android:name=""
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"

            android:windowSoftInputMode="stateVisible|adjustPan" />

關鍵代碼,應該是最后一行代碼。

至于,在代碼中跳轉到下一個頁面,手動關閉軟鍵盤的代碼,如下:

//如果顯示輸入框就關閉

 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
        }

2.6關于EditText最后的一些補充

2.6.1

   EditText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
                    return true;
                }
                return false;
            }
        });

此方法,可監控軟鍵盤是否按下、刪除,可在其中做一些操作,返回true表示相應,返回false表示不響應

2.6.2

有些時候,對于edittext的輸入,會做一定的要求,比如說必須數字,必須字母,必須大寫之內的,下面提供一個,必須包含兩種不同字符,即數字、字母,特殊字符,至少有其二的一個方法:

    public static boolean isContain(String str) {
        boolean isDigit = false;//定義一個boolean值,用來表示是否包含數字
        boolean isLetter = false;//定義一個boolean值,用來表示是否包含字母
        boolean isOther = false;//定義一個boolean值,用來表示是否包含字符

        for (int i = 0; i < str.length(); i++) {
            if (Character.isDigit(str.charAt(i))) {   //用char包裝類中的判斷數字的方法判斷每一個字符
                isDigit = true;
            } else if (Character.isLetter(str.charAt(i))) {  //用char包裝類中的判斷字母的方法判斷每一個字符
                isLetter = true;
            } else {
                isOther = true;
            }
        }
        boolean isRight = (isDigit && isLetter) || (isDigit && isOther) || (isLetter && isOther);
        return isRight;
    }

總結

在參加工作的這一年里,我感覺自己學到了很多,從一開始的懵懵懂懂,到現在,是越來越自信了。

而關于我以上所述的,其實通過百度、google,都是可以找到的,在技術這一路上,不管是Android,還是其他語言,需要的是獨立自主解決問題的能力,學會學習,你才能在這條路上走得更遠,最后,祝你我都能成為更好的Android開發人員。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容