Android自定义Dialog带分隔的8位输入框按钮回调输入值

来源:互联网 发布:武易传奇物品数据库 编辑:程序博客网 时间:2024/05/01 20:51

第一次写博客,实现一个分隔输入框的自定义对话框,点击按钮通过回调方法在调用界面获取输入值,代码也是东拼西凑来的,所以谢谢各位的分享,从哪抄的忘了所以就不贴地址了,如果在意,请联系我删除。话不多说直接贴代码。

首先看一下效果图,大家可以看看是不是自己想要的效果,避免浪费时间。


一、布局文件

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:gravity="center"      android:orientation="vertical">        <LinearLayout          android:layout_width="350dp"          android:layout_height="230dp"          android:background="@drawable/shape_corner_backcolor"          android:gravity="center"          android:orientation="vertical">            <TextView              android:id="@+id/title_num"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:text="请输入珠子上的数字"              android:textColor="#000"              android:textSize="18dp" />            <FrameLayout              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_marginTop="20dp">                <LinearLayout                  android:layout_width="wrap_content"                  android:layout_height="wrap_content"                  android:background="@drawable/shape_corner_black"                  android:gravity="center"                  android:orientation="horizontal">                    <TextView                      android:id="@+id/num_1"                      android:layout_width="39dp"                      android:layout_height="39dp"                      android:background="@drawable/lift_corner_back"                      android:gravity="center"                      android:textColor="#000"                      android:textSize="20dp" />                    <TextView                      android:id="@+id/num_2"                      android:layout_width="39dp"                      android:layout_height="39dp"                      android:background="@drawable/shape_stroke"                      android:gravity="center"                      android:textColor="#000"                      android:textSize="20dp" />                    <TextView                      android:id="@+id/num_3"                      android:layout_width="39dp"                      android:layout_height="39dp"                      android:background="@drawable/shape_stroke"                      android:gravity="center"                      android:textColor="#000"                      android:textSize="20dp" />                    <TextView                      android:id="@+id/num_4"                      android:layout_width="39dp"                      android:layout_height="39dp"                      android:background="@drawable/shape_stroke"                      android:gravity="center"                      android:textColor="#000"                      android:textSize="20dp" />                    <TextView                      android:id="@+id/num_5"                      android:layout_width="39dp"                      android:layout_height="39dp"                      android:background="@drawable/shape_stroke"                      android:gravity="center"                      android:textColor="#000"                      android:textSize="20dp" />                    <TextView                      android:id="@+id/num_6"                      android:layout_width="39dp"                      android:layout_height="39dp"                      android:background="@drawable/shape_stroke"                      android:gravity="center"                      android:textColor="#000"                      android:textSize="20dp" />                    <TextView                      android:id="@+id/num_7"                      android:layout_width="39dp"                      android:layout_height="39dp"                      android:background="@drawable/shape_stroke"                      android:gravity="center"                      android:textColor="#000"                      android:textSize="20dp" />                    <TextView                      android:id="@+id/num_8"                      android:layout_width="39dp"                      android:layout_height="39dp"                      android:background="@drawable/right_corner_back"                      android:gravity="center"                      android:textColor="#000"                      android:textSize="20dp" />                </LinearLayout>                <EditText                  android:id="@+id/et_real"                  android:layout_width="310dp"                  android:layout_height="40dp"                  android:background="@null"                  android:cursorVisible="false"                  android:inputType="number"                  android:maxLength="8"                  android:maxLines="1"                  android:textColor="#00000000"                  android:textCursorDrawable="@null" />            </FrameLayout>              <LinearLayout              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_marginTop="20dp">                <Button                  android:id="@+id/abrogate_num"                  android:layout_width="wrap_content"                  android:layout_height="wrap_content"                  android:background="@drawable/shape_d32e37"                  android:text="取消" />                <Button                  android:id="@+id/count_num"                  android:layout_width="wrap_content"                  android:layout_height="wrap_content"                  android:layout_marginLeft="45dp"                  android:background="@drawable/shape_01caff"                  android:text="确认" />          </LinearLayout>          </LinearLayout>      </LinearLayout>  
这是dialog的布局文件,稍后我会上传背景的.xml文件(看来下上传后最少需要2个积分下载,那就在后边贴出来吧,只贴一个,其他类似)。没有什么复杂的东西,注意的是中间有个帧布局,透明的EditText覆盖在8个框框上边,这样是可以通过点击输入区域弹出键盘等效果,代码里也实现了在动弹出系统键盘,保证开始状态显示键盘,提高友好性。


二、主要代码

/**  * 挫其锐,解其纷,和其光,同其尘。  */    public class NumberDialog extends Dialog implements View.OnClickListener {        private TextView num_1;      private TextView num_2;      private TextView num_3;      private TextView num_4;      private TextView num_5;      private TextView num_6;      private TextView num_7;      private TextView num_8;      private Button positiveButton;      private Button negativeButton;      private EditText relNumEdit;      private String _num;        private NumCallback mCallback;      private Context mContext;        public interface NumCallback {          void callback(String nums);      }        public NumberDialog(Context context) {          super(context);          mContext = context;          requestWindowFeature(Window.FEATURE_NO_TITLE);          setContentView(R.layout.dialog_nums);          setCanceledOnTouchOutside(false);            num_1 = findViewById(R.id.num_1);          num_2 = findViewById(R.id.num_2);          num_3 = findViewById(R.id.num_3);          num_4 = findViewById(R.id.num_4);          num_5 = findViewById(R.id.num_5);          num_6 = findViewById(R.id.num_6);          num_7 = findViewById(R.id.num_7);          num_8 = findViewById(R.id.num_8);          relNumEdit = findViewById(R.id.et_real);          relNumEdit.addTextChangedListener(new EditChangeListener(relNumEdit));          positiveButton = findViewById(R.id.count_num);          positiveButton.setOnClickListener(this);          negativeButton = findViewById(R.id.abrogate_num);          negativeButton.setOnClickListener(this);      }        @Override      public void onClick(View v) {          switch (v.getId()) {              case R.id.count_num:                  if (_num != null) {                      buttonClickListener.positiveButtonClick(_num);                      NumberDialog.this.dismiss();                  } else {                      Toast.makeText(mContext, "输入位数错误", Toast.LENGTH_LONG).show();                  }                  break;              case R.id.abrogate_num:                  buttonClickListener.negativeButtonClick();                  NumberDialog.this.dismiss();                  break;          }        }        public void showKeyboard() {          if (relNumEdit != null) {              //设置可获得焦点              relNumEdit.setFocusable(true);              relNumEdit.setFocusableInTouchMode(true);              //请求获得焦点              relNumEdit.requestFocus();              //调用系统输入法              InputMethodManager inputManager = (InputMethodManager) relNumEdit                      .getContext().getSystemService(Context.INPUT_METHOD_SERVICE);              inputManager.showSoftInput(relNumEdit, 0);          }      }        private OnButtonClickListener buttonClickListener;        public void setOnButtonClickListener(OnButtonClickListener listener) {          this.buttonClickListener = listener;      }        //实现回调功能      public interface OnButtonClickListener {          void positiveButtonClick(String s);            void negativeButtonClick();      }          public void setNumCallback(NumCallback mCallback) {          this.mCallback = mCallback;      }        private class EditChangeListener implements TextWatcher {            private EditText editText;            public EditChangeListener(EditText editText) {              this.editText = editText;          }            @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 ret = s.toString().trim();              Log.i("dialog", "afterTextChanged: " + ret);              if (editText.getId() == R.id.et_real) {                  char[] array = ret.toCharArray();                  int i;                  for (i = 0; i < array.length; i++) {                      switch (i) {                          case 0:                              num_1.setText(String.valueOf(array[0]));                              break;                          case 1:                              num_2.setText(String.valueOf(array[1]));                              break;                          case 2:                              num_3.setText(String.valueOf(array[2]));                              break;                          case 3:                              num_4.setText(String.valueOf(array[3]));                              break;                          case 4:                              num_5.setText(String.valueOf(array[4]));                              break;                          case 5:                              num_6.setText(String.valueOf(array[5]));                              break;                          case 6:                              num_7.setText(String.valueOf(array[6]));                              break;                          case 7:                              num_8.setText(String.valueOf(array[7]));                              break;                      }                  }                    for (int j = i; j < 8; j++) {                      switch (j) {                          case 0:                              num_1.setText("");                              break;                          case 1:                              num_2.setText("");                              break;                          case 2:                              num_3.setText("");                              break;                          case 3:                              num_4.setText("");                              break;                          case 4:                              num_5.setText("");                              break;                          case 5:                              num_6.setText("");                              break;                          case 6:                              num_7.setText("");                              break;                          case 7:                              num_8.setText("");                              break;                      }                  }                  if (array.length == 8) {                      _num = ret;                      if (mCallback != null) {                          mCallback.callback(ret);                      }                  }              }          }      }  }

以上是主要代码,其中有两个接口,调用效果是不同的。

public interface NumCallback {        void callback(String nums);    }

这个接口这样调用

dialog.setNumCallback(new NumberDialog.NumCallback() {                    @Override                    public void callback(String nums) {                                            }                });

参数nums将在输入8位数字后自动赋值,具体请看dialog代码最后,通过mCallback.callback(ret)完成赋值。需要注意的是这种方法在输入8位后自动返回输入值,与按钮没有关系。 

如此看第二个接口

public interface OnButtonClickListener {        void positiveButtonClick(String s);        void negativeButtonClick();    }

从名字就可以看出这是这是点击按钮的监听回调方法,这个方法在界面调用方法如下:

dialog.setOnButtonClickListener(new NumberDialog.OnButtonClickListener() {            @Override            public void positiveButtonClick(String s) {                Toast.makeText(MainActivity.this, "sha" + s, Toast.LENGTH_LONG).show();            }            @Override            public void negativeButtonClick() {            }        });

参数s就是输入的值。然后做你爱做的事。

刚才说的自动弹出键盘的放在dialog的代码里,方法showKeyboard()。

我是通过一个定时调用的这个方法,如下:

new Timer().schedule(new TimerTask() {            @Override            public void run() {                dialog.showKeyboard();            }        }, 300);

最后说一下,删除框内数字我用了一个for循环,如果有更好的方式请分享。

另附部分代码下载。

背景布局文件

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">    <corners        android:bottomLeftRadius="5dp"        android:bottomRightRadius="5dp"        android:topLeftRadius="5dp"        android:topRightRadius="5dp" />    <stroke        android:width="0.5dp"        android:color="#fff" />    <solid android:color="#fff"/></shape>





阅读全文
0 0
原创粉丝点击