title: Retrieving Value from EditText in DialogFragment
body: <p>I'm going through Google's Android Developer page on Dialogs, specifically <a href="http://developer.android.com/guide/topics/ui/dialogs.html#PassingEvents" rel="noreferrer">this</a> section. However, instead of creating the DialogFragment's message programmatically, I made a pre-set layout named <code>layout_newpayperiod.xml</code> with the following elements:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" &gt;
  
  &lt;Spinner
      android:id="@+id/spinner_payperiod"
      android:layout_width="fill_parent"
      android:layout_height="48dp"
      android:padding="8dp"
      android:entries="@array/pay_periods"
      /&gt;
  
  &lt;EditText
      android:id="@+id/edittext_savepercent"
      android:layout_width="fill_parent"
      android:layout_height="48dp"
      android:padding="8dp"
      android:inputType="number"
      android:hint="Percent to Save"
      /&gt;
  
  &lt;EditText
      android:id="@+id/edittext_payment"
      android:layout_width="fill_parent"
      android:layout_height="48dp"
      android:padding="8dp"
      android:inputType="numberDecimal"
      android:hint="Total Payment"
      /&gt;
  
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>When I call the DialogFragment it shows up as normal, with the Spinner having the proper values. I filled in the entries and hit "OK", but when I try to retrieve the values from the Spinner and two EditText fields, the app forces close with a <code>NumberFormatException: Invalid double ""</code>. I get the feeling I'm not retrieving the Views properly. Can anyone help me figure this out please? Thanks!</p>
  
  <pre><code>public class StartPayperiodDialogFragment extends DialogFragment {
  
  /* The activity that creates an instance of this dialog fragment must
   * implement this interface in order to receive event callbacks.
   * Each method passees the DialogFragment in case the host needs to query it.
   */
  public interface StartPayperiodDialogListener{
      public void onDialogPositiveClick(DialogFragment dialog);
      public void onDialogNegativeClick(DialogFragment dialog);
  }
  
  // Use this instance of the interface to deliver action events
  StartPayperiodDialogListener listener;
  
  // Override the Fragment.onAttach() method to instantiate the StartPayperiodDialogListener
  @Override
  public void onAttach(Activity activity){
      super.onAttach(activity);
      // Verify that the host activity implements the callback interface
      try{
          // Instantiate the NoticeDialogListener so we can send events to the host
          listener = (StartPayperiodDialogListener) activity;
      }catch(ClassCastException e){
          // The activity doesn't implement the interface, throw exception
          throw new ClassCastException(activity.toString() + " must implement StartPayperiodDialogListener");
      }
  }
  
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState){
      // Use the Builder class for convenient dialog construction
      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
      View transactionLayout = View.inflate(getActivity(), R.layout.layout_newpayperiod, null);
      builder.setView(transactionLayout)
      .setPositiveButton("OK", new DialogInterface.OnClickListener() {
  
          @Override
          public void onClick(DialogInterface dialog, int which) {
              // Send the positive button event back to the calling activity
              listener.onDialogPositiveClick(StartPayperiodDialogFragment.this);
          }
      })
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
  
          @Override
          public void onClick(DialogInterface dialog, int which) {
              // Send the negative button event back to the calling activity
              listener.onDialogNegativeClick(StartPayperiodDialogFragment.this);
          }
      });
      return builder.create();
  }
  </code></pre>
  
  <p>}</p>
  
  <p>In MainActivity.class, the callback method:</p>
  
  <pre><code>@Override
  public void onDialogPositiveClick(DialogFragment dialog) {
      // User pressed OK, so we need to grab the values from the
      // dialog's fields and apply them to the Views in the Main
      // Activity
  
      View transactionLayout = View.inflate(this, R.layout.layout_newpayperiod, null);
  
      // Start with the payment amount
      EditText paymentEt = (EditText) transactionLayout.findViewById(R.id.edittext_payment);
      TextView paymentTv = (TextView) findViewById(R.id.text_paycheck);
      paymentTv.setText(moneyFormat.format(Double.parseDouble(paymentEt.getText().toString())));
  
      // Next, the percent to save
      EditText savingsEt = (EditText) transactionLayout.findViewById(R.id.edittext_savepercent);
      TextView savingsTv = (TextView) findViewById(R.id.text_savings);
      savingsTv.setText(savingsEt.getText().toString() + "%");
  
      // Then, the pay period
      Spinner periodSp = (Spinner) transactionLayout.findViewById(R.id.spinner_payperiod);
      TextView periodTv = (TextView) findViewById(R.id.text_payperiod);
      periodTv.setText(periodSp.getSelectedItem().toString());
  
      // Finally, let's update the daily allowance amount and clear
      // the adapter
      adapter.clear();
      adapter.notifyDataSetChanged();
      TextView allowanceTv = (TextView) findViewById(R.id.text_allowance);
      Double allowanceValue;
      switch(periodSp.getSelectedItemPosition()){
          case(0):    // Daily
              allowanceValue = Double.parseDouble(paymentTv.getText().toString());
              break;
          case(1):    // Weekly
              allowanceValue = Double.parseDouble(paymentTv.getText().toString()) / 7;
              break;
          case(2):    // 2 Weeks
              allowanceValue = Double.parseDouble(paymentTv.getText().toString()) / 14;
              break;
          case(3):    // 30 Days
              allowanceValue = Double.parseDouble(paymentTv.getText().toString()) / 30;
              break;
          default:    // Debugging purposes only
              allowanceValue = 42.0;
              break;
      }
      allowanceTv.setText(Double.toString(allowanceValue));
  }
  </code></pre>