- 效果動圖
實現思路
- 繪製多個TextView控制元件用來顯示數字
- 繪製隱藏EditText用來接收輸入法內容(防止部分手機或輸入法監聽不到內容)
- 將EditText的內容顯示到TextView中
程式碼實現
- 自定義控制元件繼承至LinearLayout
public class CodeEditView extends LinearLayout
複製程式碼
- 繪製多個TextView並繪製方塊邊框背景用來顯示數字
for (int i = 0; i < EditViewNum; i++) {
TextView textView = new TextView(mContext);
textView.setBackgroundResource(R.drawable.shape_border_normal);
textView.setGravity(Gravity.CENTER);
textView.setTextSize(DensityUtil.sp2px(mContext,textSize));
textView.getPaint().setFakeBoldText(true);
textView.setLayoutParams(params);
textView.setInputType(inputTyte);
textView.setTextColor(textColor);
textView.setOnClickListener(this);
mTextViewsList.add(textView);
addView(textView);
}
複製程式碼
- 繪製EditText並將背景設為透明(不讓使用者看到,僅用來監聽輸入法內容,防止部分手機或輸入法不相容)
mEditText = new EditText(context);
mEditText.setBackgroundColor(Color.parseColor("#00000000"));
mEditText.setMaxLines(1);
mEditText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);
mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(EditViewNum)});
mEditText.addTextChangedListener(this);
mEditText.setTextSize(0);
addView(mEditText);
複製程式碼
- 監聽輸入法內容進行邏輯處理
@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) {
if (callBack!=null) {
callBack.afterTextChanged(s.toString());
}
if (s.length() <= 1) {
mTextViewsList.get(0).setText(s);
} else {
mTextViewsList.get(mEditText.getText().length() - 1).setText(s.subSequence(s.length() - 1, s.length()));
}
if (s.length()==EditViewNum) {
if (callBack!=null) {
callBack.input(mEditText.getText().toString());
}
}
}
複製程式碼
- 當點選TextView時,將EditText獲取到焦點並彈出輸入法
@Override
public void onClick(View v) { //TextView點選時獲取焦點彈出輸入法
mEditText.setFocusable(true);
mEditText.setFocusableInTouchMode(true);
mEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
複製程式碼
Demo地址
- GitHub地址: github.com/lvkaixuan/C…
- CSDN部落格地址: blog.csdn.net/lvkaixuan/a…
掃碼下載apk