Note that there are some explanatory texts on larger screens.

plurals
  1. PORetrieving Value from EditText in DialogFragment
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload