欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-29 22:18:40
...

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

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

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

一、布局文件

<?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>