在自定义对话框的Android
我试图做我的自定义对话框控件空引用,在自定义对话框的Android
所以我做了布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/dialog_newpassord"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="24dp"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
android:ems="10"
android:hint="@string/activity_login_field_password_hint"
android:inputType="textPassword"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dialog_title"/>
<EditText
android:id="@+id/dialog_newpassord2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="24dp"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginStart="24dp"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="@string/dialog_newPassword"
android:inputType="textPassword"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dialog_newpassord"/>
<TextView
android:id="@+id/dialog_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<Button
android:id="@+id/dialog_button_ko"
android:layout_width="wrap_content"
android:layout_height="36dp"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="16dp"
android:text="@android:string/cancel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@+id/dialog_button_ok"
app:layout_constraintTop_toBottomOf="@+id/dialog_newpassord2"/>
<Button
android:id="@+id/dialog_button_ok"
android:layout_width="wrap_content"
android:layout_height="36dp"
android:layout_marginBottom="16dp"
android:layout_marginEnd="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="16dp"
android:text="@string/ok"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dialog_newpassord2"/>
<TextView
android:id="@+id/dialog_alert"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="TextView"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dialog_newpassord2"/>
</android.support.constraint.ConstraintLayout>
然后在活动中我有:
private void newPasswordDialog(){
Dialog dialog = new Dialog(ctx);
dialog.setContentView(R.layout.dialog_login);
dialog.setTitle("New password");
final EditText password = (EditText) dialog.findViewById(R.id.dialog_newpassord);
final EditText password2 = (EditText) dialog.findViewById(R.id.dialog_newpassord2);
Button cancel = (Button) dialog.findViewById(R.id.dialog_button_ko);
Button accept = (Button) dialog.findViewById(R.id.dialog_button_ok);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
accept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(isEmptyEditText(password) || isEmptyEditText(password2))
{
//Lanzar visibility y meter texto
}
else
{
//comprobar que son iguales los passwords
}
}
});
}
但是当我启动应用程序并调用newPasswordDialog时,所有对小部件的引用都设置为null,并且很明显当到达cancel.onClic{..}
时它崩溃
如何避免这种空引用?
试试这种方法。
private void newPasswordDialog(){
AlertDialog.Builder dialog = new
AlertDialog.Builder(yourClass.this);//Activity.this
View v=getLayoutInflator.inflate(R.layout.dialog_login,null);
dialog.setView(v);
//dialog.setContentView(R.layout.dialog_login);
dialog.setTitle("New password");
final EditText password = (EditText) v.findViewById(R.id.dialog_newpassord);
final EditText password2 = (EditText) v.findViewById(R.id.dialog_newpassord2);
Button cancel = (Button) v.findViewById(R.id.dialog_button_ko);
Button accept = (Button) v.findViewById(R.id.dialog_button_ok);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
accept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(isEmptyEditText(password) || isEmptyEditText(password2))
{
//Lanzar visibility y meter texto
}
else
{
//comprobar que son iguales los passwords
}
}
});
AlertDialog d=dialog.create();
d.show();
}
已更改,但仍在窗口小部件上返回null。我改为:'dialog.findViewById(...)'到'v.findViewById(...)',因为AS是在对话框中不可能的“警告”。即使是这种变化,也没有返回参考。 – Shudy
'getLayoutInflator.inflate'甚至有效吗? oO 确保你正在给正确的布局文件充气@Shudy –
对不起,我不会改变那个@Shudy –
问题在于你的ctx。你在哪里调用这个Dialog.Activity或Adapter或Fragment? –
从活动调用。 'this.ctx = this;' – Shudy
请尝试以下回答 –