问题描述
我正在尝试在AlertDialog的OnShowListener中复制一个click事件,该事件在Java中运行良好,以防止在按下BUTTON_POSITIVE时AlertDialog关闭,这是我在Java中的代码:
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
View view = getLayoutInflater().inflate(R.layout.dialog_password_confirm,null);
builder.setView(view);
AlertDialog dialog = builder.setPositiveButton(getString(R.string.text_ok)+"",null)
.create();
dialog.setTitle("Acceso Supervisor");
dialog.setCancelable(false);
final EditText editPass = view.findViewById(R.id.edit_password_passwordconfirm);
dialog.setonShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(final DialogInterface dialog) {
Button btnAceptar = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE);
btnAceptar.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String pass = editPass.getText().toString().trim();
if (pass == null || pass.equals("")){
Toast.makeText(getContext(),"Ingresa una contraseña valida",Toast.LENGTH_SHORT).show();
} else {
if (UsuarioModel.verifySupervisorPassword(getContext(),pass)){
dialog.dismiss();
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editPass.getwindowToken(),0);
Intent intent = new Intent(getContext(),ResumenDocActivity.class);
startActivity(intent);
} else {
Toast.makeText(getContext(),"Oops! contraseña incorrecta",Toast.LENGTH_SHORT).show();
}
}
}
});
}
});
dialog.setButton(DialogInterface.BUTTON_NEUTRAL,getString(R.string.text_cancel) + "",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
dialog.dismiss();
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editPass.getwindowToken(),0);
}
});
dialog.show();
editPass.setonFocuschangelistener(new View.OnFocuschangelistener() {
@Override
public void onFocusChange(View v,boolean hasFocus) {
editPass.post(new Runnable() {
@Override
public void run() {
InputMethodManager inputMethodManager= (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(editPass,InputMethodManager.SHOW_IMPLICIT);
}
});
}
});
editPass.requestFocus();
此Java代码很好用,即使输入了错误的密码也不会关闭AlertDialog,但是无法在Kotlin中复制它,这是我的代码:
val builder: AlertDialog.Builder = AlertDialog.Builder(context!!)
val view = layoutInflater.inflate(R.layout.dialog_password_confirm,null)
var editPass = view.findViewById<EditText>(R.id.edit_password_passwordconfirm);
val dialog: AlertDialog = builder.setView(view)
.setPositiveButton(getString(R.string.text_ok),null)
.create()
dialog.setTitle("Acceso Supervisor")
var btnOk = dialog?.getButton(AlertDialog.BUTTON_POSITIVE)
dialog.setonShowListener(object: DialogInterface.OnShowListener{
override fun onShow(dialog: DialogInterface?) {
var btnOk1 = dialog.let{ btnOk }
btnOk1?.setonClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
var pass = editPass.getText().toString().trim();
if (pass.equals("")){
Toast.makeText(getContext(),pass)){
dialog?.dismiss()
val imm = activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(editPass.windowToken,0)
var rrf = ReporteRetirosFragment.newInstance()
fragmentManager?.beginTransaction()?.replace(R.id.contenedor_reportes_tpv,rrf)
?.addToBackStack("reporteRetirosTpvFragment")?.commit()
} else {
Toast.makeText(getContext(),Toast.LENGTH_SHORT).show();
}
}
}
})
}
})
dialog.setCanceledOnTouchOutside(false)
dialog.show()
请问有人知道我在Kotlin的问题吗?
解决方法
好的,我只是继续尝试重新制作您的xml文件。我希望它足够准确。 想象一下,这是您要扩展到警报对话框中的xml文件:
<TextView
android:id="@+id/txtTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="Title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editPass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:hint="Password"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtTitle" />
<Button
android:id="@+id/btnOK"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="OK"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editPass" />
然后此代码应该可以工作,并且比您编写的代码干净得多(没有违法):
val view : View = LayoutInflater.from(this).inflate(R.layout.dialog_password_confirm,null)
view.txtTitle.text = "Acceso Supervisor"
view.btnOK.text = getString(R.string.text_ok)
val myAlertDialog = AlertDialog.Builder(this)
.setView(view)
.setCancelable(false)
.show()
myAlertDialog.btnOK.setOnClickListener {
val pass = myAlertDialog.editPass.text.toString().trim()
if (pass.isBlank()) {
Toast.makeText(this,"Ingresa una contraseña valida",Toast.LENGTH_SHORT).show()
} else {
if (UsuarioModel.verifySupervisorPassword(getContext(),pass)) {
myAlertDialog.dismiss()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(myAlertDialog.editPass.windowToken,0)
var rrf = ReporteRetirosFragment.newInstance()
fragmentManager?.beginTransaction()?.replace(R.id.contenedor_reportes_tpv,rrf)?.addToBackStack("reporteRetirosTpvFragment")?.commit()
} else {
Toast.makeText(this,"Oops! contraseña incorrecta",Toast.LENGTH_SHORT).show();
}
}
}
,
这可能会失败,因为您在创建getButton
之后,在调用Dialog
之前以及完成布局传递之前立即调用show
,因此按钮可能不会已经创建。您的Java代码会在onShow
回调过程中抓住按钮,这在显示后发生。
我个人会将您的验证码放在另一个函数中,然后执行以下操作:
val dialog: AlertDialog = builder.setView(view)
.setTitle("Acceso Supervisor")
.setCancelable(false)
.setPositiveButton(getString(R.string.text_ok)) { handleClick() }
.create()
然后
fun handleClick() {
val pass = myAlertDialog.editPass.text.toString().trim()
if (pass.isBlank()) {
....
}
您将需要存储对创建的Dialog
的引用,因此您可以在该函数中dismiss
对其进行引用,因为此处没有使用DialogFragment
。
(您的Java代码也有所不同-您正在执行setCancelable(false)
,但没有在Kotlin代码中进行操作,并且还在检查空密码或空密码,但是在Kotlin中,您只是在检查密码空一个-您可以执行if (pass.isNullOrBlank())
,它应该处理所有空白字符,并且您不需要trim()
字符串)