2017-07-20 6 views
0

Je travaille sur une application qui utilise une vue personnalisée pour un AlertDialog. Je veux faire en sorte que le bouton de soumission soit désactivé si le champ de texte d'édition est vide. J'ai trouvé quelques exemples en ligne mais ma mise en œuvre ne cesse de retourner null sur la référence au bouton submit. dès que j'entre un texte dans l'edittext, l'application se bloque. voici la classe AlertDialog avec ma tentative échouer à saisir le bouton commenté:référence au bouton AlertDialog personnalisé renvoie null lorsque onTextChanged

public class FileNameDialogFragment extends DialogFragment { 
private static final String TAG = "dialogFragment"; 

private EditText namefield; 
private Button submit; 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState){ 

    LayoutInflater inflater = LayoutInflater.from(getActivity()); 
    View v = inflater.inflate(R.layout.file_prompt_dialog, null, false); 
    namefield = (EditText) v.findViewById(R.id.nameField); 

    AlertDialog dialog = new AlertDialog.Builder(getActivity()) 
      .setTitle(R.string.dialog_title) 
      .setView(v) 
      .setIcon(R.drawable.icon) 
      .setPositiveButton(R.string.btnOK, new DialogInterface.OnClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        MainActivity.setFileName(namefield.getText().toString()); 
        String fileName = namefield.getText().toString(); 
        Toast.makeText(getActivity(), MainActivity.getUrl().toString(), Toast.LENGTH_SHORT).show(); 
        MainActivity.download(MainActivity.getUrl(), getActivity(), MainActivity.getPath(), fileName); 
       } 
      }) 
      .setNegativeButton(R.string.btnCancel, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dismiss(); 
       } 
      }) 
      .create(); 

      //I have also tried to place the code that is below here. neither works 

    dialog.show(); 
    /* 
    * this is the section of code that i am having trouble with 
    * 
    submit = ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE); 
    namefield.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      //left intentionally blank 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (count == 0){ 
       submit.setEnabled(false); 
      }else{ 
       submit.setEnabled(true);<--NullPointerException 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      //left intentionally blank 
     } 
    });*/ 
    return dialog; 
} 
} 

J'espère savoir comment faire ce travail comme un moyen de valider l'entrée. Je ne veux pas que l'utilisateur puisse laisser ce champ vide parce que l'entrée est utilisée pour nommer un fichier téléchargé sur Internet.

+0

Vous définissez une vue personnalisée dans la boîte de dialogue. Je pense que le 'getButton' standard ne fonctionnera pas, et vous devez employer' v.findViewByID() ' –

+0

Veuillez attacher le journal. –

Répondre

1

Vous pouvez essayer le code ci-dessous, je l'ai spécifié comment vous pouvez désactiver le bouton personnalisé, ainsi que le bouton positif/négatif de dialogue en fonction de votre editText valeur

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    LayoutInflater inflater = LayoutInflater.from(getActivity()); 
    View v = inflater.inflate(R.layout.file_prompt_dialog, null, false); 
    namefield = v.findViewById(R.id.nameField); 

    //To get custom button of dialog 
    submit = v.findViewById(R.id.submitBtn); 

    final AlertDialog dialog = new AlertDialog.Builder(getActivity()) 
      .setTitle(R.string.dialog_title) 
      .setView(v) 
      .setIcon(R.mipmap.ic_launcher) 
      .setPositiveButton(R.string.btnOK, new DialogInterface.OnClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        MainActivity.setFileName(namefield.getText().toString()); 
        String fileName = namefield.getText().toString(); 
        Toast.makeText(getActivity(), "Positive Button", Toast.LENGTH_SHORT).show(); 
        MainActivity.download(MainActivity.getUrl(), getActivity(), MainActivity.getPath(), fileName); 
       } 
      }) 
      .setNegativeButton(R.string.btnCancel, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dismiss(); 
       } 
      }) 
      .create(); 

    dialog.show(); 

    //Dialog's positive button 
    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); 

    //Custom button 
    submit.setEnabled(false); 

    namefield.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      //left intentionally blank 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (count == 0){ 

       //To disable dialog's positive button 
       dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); 

       //To disable custom button 
       submit.setEnabled(false); 
      }else{ 

       //To enable dialog/s positive button 
       dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); 

       //To enable custom button 
       submit.setEnabled(true); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      //left intentionally blank 
     } 
    }); 

    return dialog; 
} 
0

Utilisez v.findViewByID() pour trouver votre bouton, puis rendez le bouton invisible ou visible dans textListener. J'espère que cela vous aide.

submit.setVisibility(View.INVISIBLE); 
1

Vous devez trouver ce bouton avant vous pouvez assigner en utilisant comme @Ojas dit v.findViewById. Et si vous voulez être désactivé et que vous ne savez pas à quel point il est complètement invisible. Essayez avec ce code

buttonRight.setEnabled(false); 
    buttonRight.setAlpha(0.5f); 

(cela désactive et setAlpha rendra la moitié transparente qui fera ressembler à un bouton désactivé).

Et aussi ne pas utiliser count == 0 essayez TextUtils.isEmpty(namefield.getText().toString()) c'est une solution plus propre qui est une bonne pratique à utiliser.