How to set selected Dialog values to TextViews in Fragment
android, android-dialogfragment, android-fragments, fragment
Solution
You can also pass `TextView`'s object to `DialogFragment` of `TimePickerFragment` & `DatePickerFragment`.
Below is sample overview.
create constructor of `DatePickerFragment` as parameter of `TextView` and set date on that TextView.
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
TextView mTextView;
DatePickerDialog mDatePickerDialog;
public DatePickerFragment(TextView textview)
{
mTextView = textview;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mDatePickerDialog = new DatePickerDialog(getActivity(), this, intYear, intMonth, intDay);
return mDatePickerDialog;
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mTextView.setText(String.valueOf(dayOfMonth)+"/"+String.valueOf(monthOfYear+1)+"/"+String.valueOf(year));
}
}
How to pass textview ?
DialogFragment newFragment = new DatePickerFragment(textDate);
newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
same as for `TimePickerFragment`
DialogFragment newFragment = new TimePickerFragment(textTime);
newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
Problem
I am writing a Android App using Fragments, and in one of my fragment i am using two pickers (Date & Time). I googled and found the solution to show Dialogs in Fragment by using tap on button, and i am doing same, showing dialogs whenever user do click on respective button(s). but i am not getting how to set dialog values to their respective TextView(s). see my below code, i am using to show dialogs by using tap on buttons, DatePickerDialogFragment.java: ``` public class DatePickerDialogFragment extends DialogFragment { private DatePickerDialog.OnDateSetListener mDateSetListener; public DatePickerDialogFragment() { } DatePickerDialogFragment(OnDateSetListener dateSetListener) { mDateSetListener = dateSetListener; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker 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); // Create a new instance of DatePickerDialog and return it DatePickerDialog dpd = new DatePickerDialog(getActivity(), mDateSetListener, year, month, day); // should not accept past dates return dpd; } } ``` TimePickerFragment.java: ``` public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { private TimePickedListener mListener; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // use the current time as the default values for the picker final Calendar c = Calendar.getInstance(); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); // create a new instance of TimePickerDialog and return it return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); } @Override public void onAttach(Activity activity) { // when the fragment is initially shown (i.e. attached to the activity), cast the activity to the callback interface type super.onAttach(activity); try { mListener = (TimePickedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement " + TimePickedListener.class.getName()); } } @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { // when the time is selected, send it to the activity via its callback interface method Calendar c = Calendar.getInstance(); c.set(Calendar.HOUR_OF_DAY, hourOfDay); c.set(Calendar.MINUTE, minute); mListener.onTimePicked(c); } public static interface TimePickedListener { public void onTimePicked(Calendar time); } } ``` Fragment1.java: ``` public class Fragment1 extends SherlockFragment { Button buttonDate; Button buttonTime; Button buttonSubmit; TextView textDate; TextView textTime; Spinner spinner; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment1, container, false); buttonDate = (Button) rootView.findViewById(R.id.btnDate); buttonTime = (Button) rootView.findViewById(R.id.btnTime); buttonSubmit = (Button) rootView.findViewById(R.id.btnSubmit); textDate = (TextView) rootView.findViewById(R.id.txtDate); textTime = (TextView) rootView.findViewById(R.id.txtTime); /* // calendar class get the current instance of android phone clock Calendar c = Calendar.getInstance(); // a formatted object for date and time SimpleDateFormat sdfTime = new SimpleDateFormat("h:mm a"); // save date and time in string object. String strTime = sdfTime.format(c.getTime()); textTime.setText(strTime); SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MMM-yyyy"); String strDate = sdfDate.format(c.getTime()); textDate.setText(strDate);*/ buttonTime.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // show the time picker dialog DialogFragment newFragment = new TimePickerFragment(); newFragment.show(getActivity().getSupportFragmentManager(), "timePicker"); } }); buttonDate.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub DialogFragment newFragment = new DatePickerDialogFragment(); newFragment.show(getActivity().getSupportFragmentManager(), "datePicker"); } }); spinner = (Spinner) rootView.findViewById(R.id.spinner); // Spinner click listener spinner.setOnItemSelectedListener((OnItemSelectedListener) getActivity()); // Spinner Drop down elements List<String> categories = new ArrayList<String>(); categories.add("Automobile"); categories.add("Business Services"); categories.add("Computers"); categories.add("Education"); categories.add("Personal"); categories.add("Travel"); // Creating adapter for spinner ArrayAdapter<String> dataAdapter = new ArrayAdapter<String> (getActivity(), android.R.layout.simple_spinner_item, categories); // Drop down layout style - list view with radio button dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // attaching data adapter to spinner spinner.setAdapter(dataAdapter); buttonSubmit.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("message/rfc822"); intent.putExtra(Intent.EXTRA_EMAIL, "mail@emailaddress.com"); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); // in place of "Text" i want to show spinner's selected value intent.putExtra(Intent.EXTRA_TEXT, "Text"); startActivity(Intent.createChooser(intent, "Send Email")); } }); return rootView; } public void onTimePicked(Calendar time) { // display the selected time in the TextView textTime.setText(DateFormat.format("h:mm a", time)); } public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar c = Calendar.getInstance(); c.set(year, monthOfYear, dayOfMonth); setDate(c.getTime().getTime()); } private void setDate(long millisecond){ int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_MONTH | DateUtils.FORMAT_ABBREV_WEEKDAY; String dateString = DateUtils.formatDateTime(getActivity(),millisecond, flags); textDate.setText(dateString); } } ``` MainActivity.java: ``` public class MainActivity extends SherlockFragmentActivity implements TimePickedListener, OnItemSelectedListener, OnDateSetListener { // Declare Variables Fragment1 fragmentTab1; ListView list; NavListAdapter adapter; String[] title; String[] subtitle; int[] icon; Fragment fragment1 = new Fragment1(); Fragment fragment2 = new Fragment2(); Fragment fragment3 = new Fragment3(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Generate title title = new String[] { "Title Fragment 1", "Title Fragment 2", "Title Fragment 3" }; // Generate subtitle subtitle = new String[] { "Subtitle Fragment 1", "Subtitle Fragment 2", "Subtitle Fragment 3" }; // Generate icon icon = new int[] { R.drawable.action_about, R.drawable.action_settings, R.drawable.collections_cloud }; // Pass results to NavListAdapter Class adapter = new NavListAdapter(this, title, subtitle, icon); // Hide the ActionBar Title getSupportActionBar().setDisplayShowTitleEnabled(false); // Create the Navigation List in your ActionBar getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); // Listen to navigation list clicks ActionBar.OnNavigationListener navlistener = new OnNavigationListener() { @Override public boolean onNavigationItemSelected(int position, long itemId) { FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); // Locate Position switch (position) { case 0: ft.replace(android.R.id.content, fragment1); break; case 1: ft.replace(android.R.id.content, fragment2); break; case 2: ft.replace(android.R.id.content, fragment3); break; } ft.commit(); return true; } }; // Set the NavListAdapter into the ActionBar Navigation getSupportActionBar().setListNavigationCallbacks(adapter, navlistener); } @Override public void onTimePicked(Calendar time) { // TODO Auto-generated method stub } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // On selecting a spinner item String item = parent.getItemAtPosition(position).toString(); // showing a toast on selecting an item Toast.makeText(parent.getContext(), item, Toast.LENGTH_LONG).show(); } public void onNothingSelected(AdapterView<?> arg0) { } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { } } ``` for more Clearity, i am posting screen shots, please check and let me know, what i am missing. Screen 1: showing as default screen 2: showing time picker dialog screen 3: showing date picker dialog