編輯EditText輸入實現標簽顯示的樣式
最近朋友的項目遇到一個需求,就是在EditText中輸入后 按一下空格 然后前面輸入的內容就自動根據空格分組并且高亮顯示出標簽樣式,百度了一下 居然沒有搜到類似的工具,看來還的自己動手,沒圖說了誰信?先看效果圖:
Paste_Image.png
其實原理很簡單,根本不需要自定義什么亂七八糟的View,就利用現成的API就能實現效果,xml文件就不貼了,就一個EditText,自己腦補,下面主要說一下核心代碼一個類:
1.首先肯定是初始化EditText以及需要用的變量
Paste_Image.png
/** * 需要監聽的輸入框 */private EditText mEditText;/** * 記錄下上次的文本長度 */private int length=0;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEditText = (EditText) findViewById(R.id.text); mEditText.addTextChangedListener(this); mEditText.setOnKeyListener(this);}
通過代碼或者截圖發現肯定要實現兩個接口,一個是監聽EditText文本輸入,一個是軟鍵盤的刪除鍵監聽
2.實現輸入文本內容監聽
TextWatcher有三個函數需要我們實現:
beforeTextChanged輸入之前的狀態(一會用到)
onTextChanged輸入中狀態和文本變化(這里用不到)
afterTextChanged輸入結束后的狀態(這里主要實現的地方)
首先記錄下輸入文本之前的內容長度
Paste_Image.png
length是一個int的類型,前面代碼有定義
3.監聽到文本輸入結束后判斷最后一位是不是輸入了空格進行標簽樣式顯示
Paste_Image.png
/** * 核心步驟 * 主要通過SpannableString來實現標簽分組 */private void onSetSpan(){ String content = mEditText.getText().toString(); SpannableString spannable = new SpannableString(content); //通過空格來區分標簽 String[] m = content.split(" "); int start = 0; int end; for (String str : m) { end = start + str.length(); spannable.setSpan(new BackgroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); spannable.setSpan(new ForegroundColorSpan(Color.WHITE), start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); start = end + 1; } mEditText.setText(spannable); //設置完成后 需要把焦點移動到最后一位 mEditText.setSelection(spannable.length());}
是不是很簡單,只需要想明白邏輯就能實現你想要的,這里主要核心方法SpannableString分割字符串的樣式進行分別高亮顯示,SpannableString可以實現很多功能,具體的內容自己去查看資料(這不是我們的重點)。
上面實現了內容標簽化分組,那么刪除怎么玩呢?肯定也要按照標簽刪除,一次刪除一個標簽內容,而不是一個個字符刪除,這下我們OnKeyListener就有作用了,怎么刪除按照標簽刪除?直接上代碼上圖:
Paste_Image.png
/** * 監聽返回鍵,按照標簽組刪除 * @param v * @param keyCode * @param event * @return */@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) { String content = mEditText.getText().toString(); if(content.length()>0){ String last = content.substring(content.length()-1,content.length()); if(keyCode == KeyEvent.KEYCODE_DEL && !last.equals(" ")){ String[] m = content.split(" "); String lastTag = m[m.length-1]; content = content.substring(0,content.length()-lastTag.length()); mEditText.setText(content); return true; } } return false;}
總結:這樣就能滿足基本需求了,但是發現是不是標簽有點丑,也許根本達不到設計的要求,那怎么做出漂亮的標簽顯示呢?下次再說(核心還是在SpannableString上面)。先吃飯才是王道。
來自:http://www.jianshu.com/p/67543f129a15