2016-11-07 22 views
2

私は、Textviewと2つのボタン(送信とキャンセル)を含む単純なDialogFragmentを構築しようとしています。は、ダイアログボックス内の私のボタンのポインタを得ることができません

私はTextViewには、空の最初のときにボタンを無効にしたいが、私のコードでpositiveButton変数は常にnullであると私は、次の例外を取得:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setEnabled(boolean)' on a null object reference 

は、これはコードです:

public class SendFriendRequestFragment extends DialogFragment { 
private TextView tvEmail = null; 
Button positiveButton = null; 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    // Get the layout inflater 
    final LayoutInflater inflater = getActivity().getLayoutInflater(); 

    final View layout = inflater.inflate(R.layout.fragment_send_friend_request, null); 

    // Inflate and set the layout for the dialog 
    // Pass null as the parent view because its going in the dialog layout 
    builder.setView(layout) 
      .setTitle("Send request") 
      .setPositiveButton(R.string.send, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        String email = tvEmail.getText().toString().trim(); 

        if (validateInput()) { 
         SendFriendRequest(getActivity(), email); 
        } else { 
         Toast.makeText(getActivity(), "Request cannot be sent", Toast.LENGTH_LONG).show(); 
         return; 
        } 

       } 
      }) 
      .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 
       } 
      }); 

    Dialog dialog = builder.create(); 
    positiveButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE); 

    positiveButton.setEnabled(false); // positiveButton is null and this call raises an exception ! 
    tvEmail = (TextView) layout.findViewById(R.id.email); 
    tvEmail.addTextChangedListener(new InputTextWatcher(tvEmail)); 
    // Create the AlertDialog object and return it 
    //return builder.create(); 
    return dialog; 
} 
// Other functions that use the two variables positiveButton and tvEmail ... 
} 

誰も私の問題を解決する方法を教えてください、ボタンと使用されたレイアウトに含まれるビューのポインタを取得する最良の方法は何ですか?

ありがとうございました!

答えて

2

プラスButtonは、実際にはDialogが表示されるまで作成されません。 DialogFragmentにいるので、Dialogshow()コールは直接処理されません。 AlertDialogOnShowListenerを設定することができますが、DialogFragmentonStart()メソッドでButtonを取得する方が簡単です。

@Override 
public void onStart() { 
    super.onStart(); 

    positiveButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE); 
    ... 
} 
関連する問題