我将在Dialogs上浏览Google的
Android Developer页面,特别是
this部分.但是,我没有以编程方式创建DialogFragment的消息,而是使用以下元素创建了一个名为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具有正确的值.我填写了条目并点击“确定”,但是当我尝试从Spinner和两个EditText字段中检索值时,应用程序强制关闭NumberFormatException:无效的双“”.我觉得我没有正确地检索视图.谁能帮我解决这个问题呢?谢谢!
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",int which) { // Send the negative button event back to the calling activity listener.onDialogNegativeClick(StartPayperiodDialogFragment.this); } }); return builder.create(); }
}
在MainActivity.class中,回调方法:
@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,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)); }
解决方法
试试这个:
@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,从对话框中检索任何其他视图.)
您的膨胀代码“膨胀”该视图的全新版本.您想要访问在对话框中创建的那个.