Android自定义Dialog带分隔的8位输入框按钮回调输入值
程序员文章站
2022-05-29 22:18:40
...
第一次写博客,实现一个分隔输入框的自定义对话框,点击按钮通过回调方法在调用界面获取输入值,代码也是东拼西凑来的,所以谢谢各位的分享,从哪抄的忘了所以就不贴地址了,如果在意,请联系我删除。话不多说直接贴代码。
首先看一下效果图,大家可以看看是不是自己想要的效果,避免浪费时间。
一、布局文件
<?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>