最近遇到的一个bug,起初都是正常使用的,后面代码越加越多才引起。但是原因不太明白,毕竟对话框相关代码就那么点,废话不多说,直接上代码:
1.最终效果图如下
2.最终解决方案
在dialog调用setContentView()方法后设置如下代码:
alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
3.奉上创建对话框代码
public void showInputPayPwdDialog(Context context, String prices) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
final AlertDialog alertDialog = builder.create();
alertDialog.show();
View view = View.inflate(context, R.layout.view_input_pay_pwd_alert_dialog, null);
TextView tv_money = view.findViewById(R.id.tv_money);
PwdEditText edPwd = view.findViewById(R.id.ed_pwd);
TextView tvCancel = view.findViewById(R.id.tv_cancel_dialog);
TextView tvConfirm = view.findViewById(R.id.tv_confirm_dialog);
ClearEditText edInput = view.findViewById(R.id.ed_input);
ImageView btn_finish = view.findViewById(R.id.btn_finish);
btn_finish.setOnClickListener(view1 -> {
alertDialog.dismiss();
});
edPwd.setOnInputFinishListener(new PwdEditText.OnInputFinishListener() {
@Override
public void onInputFinish(String password) {
// 点击“确认”后的操作 充值金额inputString
}
});
tv_money.setText(FormatUtils.getMoneySign()+TextViewUtils.noEmpty(prices));
alertDialog.getWindow().setContentView(view);
alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}
3.以下是自定义密码输入框代码:
public class PwdEditText extends AppCompatEditText {
/**
* 间隔
*/
private final int PWD_SPACING = 5;
/**
* 密码大小
*/
private final int PWD_SIZE = 5;
/**
* 密码长度
*/
private final int PWD_LENGTH = 6;
/**
* 上下文
*/
private Context mContext;
/**
* 宽度
*/
private int mWidth;
/**
* 高度
*/
private int mHeight;
/**
* 密码框
*/
private Rect mRect;
/**
* 密码画笔
*/
private Paint mPwdPaint;
/**
* 密码框画笔
*/
private Paint mRectPaint;
/**
* 输入的密码长度
*/
private int mInputLength;
/**
* 输入结束监听
*/
private OnInputFinishListener mOnInputFinishListener;
/**
* 构造方法
*
* @param context
* @param attrs
*/
public PwdEditText(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化密码画笔
mPwdPaint = new Paint();
mPwdPaint.setColor(Color.BLACK);
mPwdPaint.setStyle(Paint.Style.FILL);
mPwdPaint.setAntiAlias(true);
// 初始化密码框
mRectPaint = new Paint();
mRectPaint.setStyle(Paint.Style.STROKE);
mRectPaint.setColor(Color.LTGRAY);
mRectPaint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mWidth = getWidth();
mHeight = getHeight();
// 这三行代码非常关键,大家可以注释点在看看效果
Paint paint = new Paint();
paint.setColor(Color.WHITE);
canvas.drawRect(0, 0, mWidth, mHeight, paint);
// 计算每个密码框宽度
int rectWidth = (mWidth - PWD_SPACING * (PWD_LENGTH - 1)) / PWD_LENGTH;
// 绘制密码框
for (int i = 0; i < PWD_LENGTH; i++) {
int left = (rectWidth + PWD_SPACING) * i;
int top = 2;
int right = left + rectWidth;
int bottom = mHeight - top;
mRect = new Rect(left, top, right, bottom);
canvas.drawRect(mRect, mRectPaint);
}
// 绘制密码
for (int i = 0; i < mInputLength; i++) {
int cx = rectWidth / 2 + (rectWidth + PWD_SPACING) * i;
int cy = mHeight / 2;
canvas.drawCircle(cx, cy, PWD_SIZE, mPwdPaint);
}
}
@Override
protected void onTextChanged(CharSequence text, int start,
int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
this.mInputLength = text.toString().length();
invalidate();
if (mInputLength == PWD_LENGTH && mOnInputFinishListener != null) {
mOnInputFinishListener.onInputFinish(text.toString());
}
}
public interface OnInputFinishListener {
/**
* 密码输入结束监听
*
* @param password
*/
void onInputFinish(String password);
}
/**
* 设置输入完成监听
*
* @param onInputFinishListener
*/
public void setOnInputFinishListener(
OnInputFinishListener onInputFinishListener) {
this.mOnInputFinishListener = onInputFinishListener;
}
}
以及,xml布局中使用自定义密码输入框控件
<com.example.jingbin.zkfudou.view.PwdEditText
android:id="@+id/ed_pwd"
android:layout_gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="15dp"
android:background="@android:color/transparent"
android:inputType="number"
android:cursorVisible="false"
android:enabled="true"
android:focusable="true"
android:maxLength="6" />