问题
My DialogFragment class is invoked when I press a button on a activity. I want the date set through this DialogFragment to be displayed on the buttons text. FindViewById refuses to be recognized by the class.
I found a similar question but I'm unable to relate it to my case.
Code:
Button which calls the Dialogue fragment:
public void datepicker(View v) { DialogFragment newFragment = new DatePickerFragment(); newFragment.show(getFragmentManager(), "datePicker"); }
Code for dialogue fragment:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceSateate) { final Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), this, year, month, day); } public void onDateSet(DatePicker view, int year, int month, int day) { // Do something with the date chosen } } }
回答1:
In the method in your DialogFragment that is in charge of being notified when the user sets the date, do this
Button activityButton = (Button)getActivity().findViewById(R.id.myButton);
activityButton.setText (myDate);
回答2:
Create Class for DatePicker Fragment:
public class SelectDateFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar now = Calendar.getInstance();
year = now.get(Calendar.YEAR);
month = now.get(Calendar.MONTH);
day = now.get(Calendar.DATE);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
orderDateEditText.setText(year + "-" + (month + 1) + "-" + day);
}
}
Call this Fragment When clicked On ImageButton:
/** Create DatePicker dialog on click of OrderDateEditText **/
orderDatePickerButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
DialogFragment newFragment = new SelectDateFragment();
newFragment.show(getFragmentManager(), "DatePicker");
}
});
In Month there is plus 1 because DatePicker default takes month from 0 to 11 for Jan to Dec.
Thank you..
回答3:
here's a good pattern to follow:
- create a listener interface in your dialog to handle the relevant button presses in the dialog
- implement it in the starting activity
- when the user presses "okay" or "cancel", call the listener methods
- do whatever you need to do in the impl of the listener to update the activity's view
something like,
class MyDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {
static interface Listener {
void onOkay(MyObject result);
void onCancel();
}
...
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
...
// set this as a listener for ok / cancel buttons
return new AlertDialog.Builder(activity)...whatever...
.setPositiveButton(R.string.ok, this)
.setNegativeButton(R.string.cancel, this).create();
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
if (getActivity() instanceof Listener) {
((Listener)getActivity()).onOkay(...);
}
} else {
if (getActivity() instanceof Listener) {
((Listener)getActivity()).onCancel();
}
}
}
}
class MyActivity extends Activity implements MyDialogFragment.Listener {
...
@Override
public void onOkay(MyObject result) {
// update activity view here with result
}
@Override
public void onCancel() {
// anything?
}
}
if your case, the "result" passed into the onOkay()
method would be the Date object picked by the user in the dialog.
回答4:
A Fragment
is not a View
. If you want to find a fragment, use findFragmentById
from the FragmentManager
.
来源:https://stackoverflow.com/questions/14024921/retrieve-and-set-data-from-dialogfragment-datepicker