在自定义对话框的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{..}时它崩溃

如何避免这种空引用?

+0

问题在于你的ctx。你在哪里调用这个Dialog.Activity或Adapter或Fragment? –

+0

从活动调用。 'this.ctx = this;' – Shudy

+0

请尝试以下回答 –

试试这种方法。

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(); 

    } 
+0

已更改,但仍在窗口小部件上返回null。我改为:'dialog.findViewById(...)'到'v.findViewById(...)',因为AS是在对话框中不可能的“警告”。即使是这种变化,也没有返回参考。 – Shudy

+1

'getLayoutInflator.inflate'甚至有效吗? oO 确保你正在给正确的布局文件充气@Shudy –

+1

对不起,我不会改变那个@Shudy –