2017-07-20 7 views
0

AlertDialogのカスタムビューを使用するアプリケーションで作業しています。編集テキストフィールドが空の場合、送信ボタンが無効になるようにしたいと思います。私はいくつかの例をオンラインで見つけましたが、私の実装では、送信ボタンへの参照でnullが返され続けています。 edittextにテキストを入力すると、アプリケーションがクラッシュします。ここでコメントアウトボタンをつかんで私の失敗の試みとalertdialogクラスは次のとおりです。カスタムAlertDialogボタンへの参照は、onTextChangedのときにnullを返します。

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; 
} 
} 

私は入力を検証するための方法として、この作品を作る方法を見つけることを期待しています。私は入力がインターネットからダウンロードされたファイルに名前を付けるために使用されるので、このフィールドを空白のままにしておきたい。

+0

ダイアログにカスタム表示を設定します。私は標準の 'getButton'は動作しないと思うので、' v.findViewByID() 'を使う必要があります –

+0

ログを添付してください。 –

答えて

1

あなたは以下のコードを試すことができ、私はあなたが前にそのボタンを見つける必要があるあなたのeditText

@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

v.findViewByID()を使用してボタンを見つけ、ボタンを非表示にするか、textListenerで表示します。それがあなたを助けることを願ってください。

submit.setVisibility(View.INVISIBLE); 
1

に応じて、カスタムボタンだけでなく、ダイアログの正/負のボタンを無効にする方法を指定していますあなたは@Ojasと言って、v.findViewByIdというように割り当てることができます。 あなたが無効になりたいと思っていて、それが完全に見えないようにするのがどれくらい良いかわからない場合。このコード

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

(これは、それを無効にし、setAlphaが、それは無効なボタンのように見えるようになる、それは半分透明になります)でそれを試してみてください。

また、count == 0を試してみてください。TextUtils.isEmpty(namefield.getText().toString())これは使用するのが良い方法です。

関連する問題