在DialogFragment中从EditText检索值

我正在通过对话框中的Google Android开发者页面,特别是本节。 但是,我没有以编程方式创buildDialogFragment消息, layout_newpayperiod.xml使用以下元素创build了一个名为layout_newpayperiod.xml的预设布局:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Spinner android:id="@+id/spinner_payperiod" android:layout_width="fill_parent" android:layout_height="48dp" android:padding="8dp" android:entries="@array/pay_periods" /> <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" /> <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" /> </LinearLayout> 

当我调用DialogFragment时,它显示为正常,Spinner具有正确的值。 我填写条目并点击“确定”,但是当我尝试从微调器和两个EditText字段中检索值时,应用程序强制closures一个NumberFormatException: Invalid double "" 。 我觉得我没有正确地检索视图。 任何人都可以帮我解决这个问题吗? 谢谢!

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

}

在MainActivity.class中,callback方法:

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

Solutions Collecting From Web of "在DialogFragment中从EditText检索值"

尝试这个:

 @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 // Start with the payment amount Dialog dialogView = dialog.getDialog(); EditText paymentEt = (EditText) dialogView.findViewById(R.id.edittext_payment); 

…等等。(以相同的方式通过查询dialogView来从对话框中检索任何其他视图。)

您的充气代码“膨胀”了该视图的全新版本。 你想访问在对话框中创build的那个。

我认为这一行View transactionLayout = View.inflate(this, R.layout.layout_newpayperiod, null); 破坏一切。 也许这不是搞乱,但你得到新创build的布局的地址,并将其分配给transactionLayout引用。 然后,您从该布局获取视图EditText paymentEt = (EditText) transactionLayout.findViewById(R.id.edittext_payment); 这当然是未初始化的。 它具有值空string值 – >“”;

我认为你应该使用findViewById来获得对你的EditText的引用,就像你对TextView的引用一样。 但是,由于您在MainActivity中的布局可能不是您的R.layout.layout_newpayperiod的父视图,因此您必须find正确的方法。

你已经有了这个onDialogPositiveClickcallback方法的DialogFragment作为参数。 所以你可以得到它的View和你正在寻找的布局 – 包含你的EditText的

对不起,编辑这个post很多次。