效果图如下
思路: linearLayout里嵌入textview用于显示数字 上盖一层透明的editText 监听输入事件,当没输入时 光标可显示 ,长安用于粘贴复制过的数字 输入后数字后 光标消失。
NumberEditText :
public class NumberEditText extends LinearLayout { /** 输入框 */ private TextView[] inputTv = new TextView[7]; /** 用于接受键盘输入内容 */ private EditText invisibleEt; /** 输入结束监听 */ private OnInputFinishListener onInputFinishListener; public NumberEditText(Context context) { super(context); createView(context); } public NumberEditText(Context context, AttributeSet attrs) { super(context, attrs); createView(context); } public NumberEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); createView(context); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public NumberEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); createView(context); } private void createView(Context context) { View view = LayoutInflater.from(context).inflate(R.layout.lemon_number_edittext, null); inputTv[0] = (TextView) view.findViewById(R.id.lemon_number_edittext_tv0); inputTv[1] = (TextView) view.findViewById(R.id.lemon_number_edittext_tv1); inputTv[2] = (TextView) view.findViewById(R.id.lemon_number_edittext_tv2); inputTv[3] = (TextView) view.findViewById(R.id.lemon_number_edittext_tv3); inputTv[4] = (TextView) view.findViewById(R.id.lemon_number_edittext_tv4); inputTv[5] = (TextView) view.findViewById(R.id.lemon_number_edittext_tv5); inputTv[6] = (TextView) view.findViewById(R.id.lemon_number_edittext_tv6); invisibleEt = (EditText) view.findViewById(R.id.lemon_number_edittext_et); invisibleEt.addTextChangedListener(new InvisibleEtTextWatcher()); addView(view); } public void setOnInputFinish(OnInputFinishListener listener) { this.onInputFinishListener = listener; } public void clearText() { int tvLength = inputTv.length; for (int i = 0; i < tvLength; i++) { inputTv[i].setText(""); } invisibleEt.setText(""); } /** * 处理从edittext到textview */ private class InvisibleEtTextWatcher implements 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 text = s.toString().trim(); char[] chars = text.toCharArray(); int length = chars.length; if (length > 0) { invisibleEt.setCursorVisible(false); } else { invisibleEt.setCursorVisible(true); } int tvLength = inputTv.length; for (int i = 0; i < tvLength; i++) { if (i < length) { inputTv[i].setText("" + chars[i]); } else { inputTv[i].setText(""); } } if (onInputFinishListener != null) { onInputFinishListener.onInputFinish(text); } } } public interface OnInputFinishListener { void onInputFinish(String text); } }
对应布局文件为:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/lemon_number_edittext_rootlayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:orientation="horizontal"> <LinearLayout android:id="@+id/lemon_number_edittext_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:orientation="horizontal"> <TextView android:id="@+id/lemon_number_edittext_tv0" style="@style/lemon_number_edittext_text" android:layout_width="@dimen/lemon_number_text_width" android:layout_height="@dimen/lemon_number_text_width"/> <TextView android:id="@+id/lemon_number_edittext_tv1" style="@style/lemon_number_edittext_text" android:layout_width="@dimen/lemon_number_text_width" android:layout_height="@dimen/lemon_number_text_width" android:layout_marginLeft="5dp"/> <TextView android:id="@+id/lemon_number_edittext_tv2" style="@style/lemon_number_edittext_text" android:layout_width="@dimen/lemon_number_text_width" android:layout_height="@dimen/lemon_number_text_width" android:layout_marginLeft="5dp"/> <TextView android:id="@+id/lemon_number_edittext_tv3" style="@style/lemon_number_edittext_text" android:layout_width="@dimen/lemon_number_text_width" android:layout_height="@dimen/lemon_number_text_width" android:layout_marginLeft="5dp"/> <TextView android:id="@+id/lemon_number_edittext_tv4" style="@style/lemon_number_edittext_text" android:layout_width="@dimen/lemon_number_text_width" android:layout_height="@dimen/lemon_number_text_width" android:layout_marginLeft="5dp"/> <TextView android:id="@+id/lemon_number_edittext_tv5" style="@style/lemon_number_edittext_text" android:layout_width="@dimen/lemon_number_text_width" android:layout_height="@dimen/lemon_number_text_width" android:layout_marginLeft="5dp"/> <TextView android:id="@+id/lemon_number_edittext_tv6" style="@style/lemon_number_edittext_text" android:layout_width="@dimen/lemon_number_text_width" android:layout_height="@dimen/lemon_number_text_width" android:layout_marginLeft="5dp"/> </LinearLayout> <EditText android:id="@+id/lemon_number_edittext_et" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/lemon_number_edittext_layout" android:layout_alignLeft="@id/lemon_number_edittext_layout" android:layout_alignRight="@id/lemon_number_edittext_layout" android:layout_alignTop="@id/lemon_number_edittext_layout" android:background="@android:color/transparent" android:inputType="number" android:paddingLeft="2dp" android:cursorVisible="true" android:textCursorDrawable="@drawable/cursor_purl" android:maxLength="7" android:textColor="@android:color/transparent" android:textColorHint="@android:color/transparent"/> </RelativeLayout>
Dialog:
public class LemonDialog extends Dialog implements View.OnClickListener { private Context mContext; private NumberEditText active_code_edit; private TextView dialogTitle, tv_cancel, tv_sure; private TextView dialogDescribe; // dialog中间描述 private ConfirmClickListener mConfirmClickListener; private String type; private String desString, sureText, cancelText, titleText; private LinearLayout ll_active_code_layout; private String currentActiveCode; public enum dialogTypes { ACTIVITYCODE, CHILDEINFO, UPDATAAPK } public LemonDialog(@NonNull Context context, String type) { super(context); this.mContext = context; this.type = type; } public interface ConfirmClickListener { void confirmClick(); } public void setConfirmClickListener(ConfirmClickListener mConfirmClickListener) { this.mConfirmClickListener = mConfirmClickListener; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.new_lemon_dialog); // 设置遮罩透明度 WindowManager.LayoutParams params = getWindow().getAttributes(); params.dimAmount = 0.7f; getWindow().setAttributes(params); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); initView(); } private void initView() { tv_cancel = (TextView) findViewById(R.id.tv_cancel); tv_sure = (TextView) findViewById(R.id.tv_sure); tv_cancel.setOnClickListener(this); tv_sure.setOnClickListener(this); active_code_edit = (NumberEditText) findViewById(R.id.active_code_edit); ll_active_code_layout = (LinearLayout) findViewById(R.id.ll_active_code_layout); dialogTitle = (TextView) findViewById(R.id.tv_title); dialogDescribe = (TextView) findViewById(R.id.tv_lemon_dialog_describe); // 孩子信息 if (dialogTypes.CHILDEINFO.name().equals(type)) { ViewUtils.setVisibility(ll_active_code_layout, View.GONE); ViewUtils.setVisibility(dialogDescribe, View.VISIBLE); } else if (dialogTypes.UPDATAAPK.name().equals(type)) { // 升级dialog ViewUtils.setVisibility(ll_active_code_layout, View.GONE); ViewUtils.setVisibility(dialogDescribe, View.VISIBLE); dialogDescribe.setText(desString); } else if (dialogTypes.ACTIVITYCODE.name().equals(type)) { // 活动码 ViewUtils.setVisibility(ll_active_code_layout, View.VISIBLE); ViewUtils.setVisibility(dialogDescribe, View.GONE); active_code_edit.setOnInputFinish(new NumberEditText.OnInputFinishListener() { @Override public void onInputFinish(String text) { currentActiveCode = text; } }); } if (!TextUtils.isEmpty(sureText)) { tv_sure.setText(sureText); } if (!TextUtils.isEmpty(cancelText)) { tv_cancel.setText(cancelText); } if (!TextUtils.isEmpty(titleText)) { dialogTitle.setText(titleText); } } public String getActivityCode() { return currentActiveCode; } public void clearActiveCode() { active_code_edit.clearText(); } public void setTitle(String title) { titleText = title; } public void setSureText(String sureText) { this.sureText = sureText; } public void setCancelText(String cancelText) { this.cancelText = cancelText; } public void setDescribeText(String desText) { desString = desText; } @Override public void onClick(View view) { switch (view.getId()) { case R.id.tv_cancel: dismiss(); break; case R.id.tv_sure: mConfirmClickListener.confirmClick(); dismiss(); break; } } }
对应布局文件为:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="280dp" android:layout_height="200dp" android:background="@drawable/lemon_dialog_bg"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="13dp" android:gravity="center" android:text="活动码" android:textColor="@color/lemon_primary_green" android:textSize="18sp"/> <TextView android:id="@+id/tv_line" android:layout_width="match_parent" android:layout_height="2dp" android:layout_below="@+id/tv_title" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="10dp" android:background="@color/lemon_primary_green"/> <TextView android:id="@+id/tv_lemon_dialog_describe" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_title" android:layout_centerHorizontal="true" android:layout_marginTop="50dp" android:textSize="18sp" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="请先完善孩子信息" android:textColor="@color/lemon_primary_black" android:visibility="gone"/> <LinearLayout android:id="@+id/ll_active_code_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerInParent="true"> <com.example.wbxu.myedittextnuminput.NumberEditText android:layout_marginTop="19dp" android:layout_marginBottom="12dp" android:layout_gravity="center_horizontal" android:id="@+id/active_code_edit" android:layout_width="wrap_content" android:layout_height="wrap_content"> </com.example.wbxu.myedittextnuminput.NumberEditText> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textColor="@color/lemon_primary_gray1" android:text="输入或粘贴活动码搜索活动"/> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_above="@+id/ll_bootom" android:background="@color/lemon_primary_gray3"/> <LinearLayout android:id="@+id/ll_bootom" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" > <TextView android:id="@+id/tv_sure" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:paddingBottom="10dp" android:paddingTop="10dp" android:text="确认" android:textColor="@color/lemon_primary_green" android:textSize="15sp"/> <TextView android:layout_width="0.5dp" android:layout_height="match_parent" android:background="@color/lemon_primary_gray3"/> <TextView android:id="@+id/tv_cancel" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:paddingBottom="10dp" android:paddingTop="10dp" android:text="取消" android:textColor="@color/lemon_primary_gray2" android:textSize="15sp"/> </LinearLayout> </RelativeLayout>
使用: MainActivity:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View view) { final LemonDialog lemonDialog = new LemonDialog(this, LemonDialog.dialogTypes.ACTIVITYCODE.name()); lemonDialog.show(); lemonDialog.setConfirmClickListener(new LemonDialog.ConfirmClickListener() { @Override public void confirmClick() { if (!TextUtils.isEmpty(lemonDialog.getActivityCode())) { Toast.makeText(MainActivity.this, "活动码为:" + lemonDialog.getActivityCode(), Toast.LENGTH_SHORT).show(); } } }); } }源码:https://github.com/FarmCoder007/myedittextnuminput