Cómo establecer valores de diálogo seleccionados en TextViews en Fragmento
Estoy escribiendo una aplicación para Android usando Fragmentos , y en uno de mis fragmentos estoy usando dos selectores (fecha y hora) .
Busqué en Google y encontré la solución para mostrar los cuadros de diálogo en Fragmento mediante el toque en el botón, y estoy haciendo lo mismo, mostrando diálogos siempre que el usuario haga clic en el botón correspondiente (s) .
- Patrón de diseño para fragmentos en android
- Android - instanciar un fragmento varias veces?
- El Menú contextual de Fragmento utiliza ListView de otro Fragmento: registerForContextMenu (getListView ())
- ListView dentro de un fragmento utilizado en un ViewPager no se comporta como se esperaba
- Un ListView puede contener fragmentos
Pero no estoy consiguiendo cómo fijar los valores del diálogo a sus TextView (s) respectivos .
Ver mi código abajo, estoy usando para mostrar diálogos usando el golpecito en los botones,
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 (ie 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, "[email protected]"); 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) { } }
Para más claridad, estoy fijando capturas de pantalla, comprueba por favor y hágamelo saber, lo que estoy faltando.
Pantalla 1: se muestra como predeterminada
Pantalla 2: mostrando el diálogo de selección de tiempo
Pantalla 3: mostrando el diálogo del selector de fechas
- Configuración de ViewModel para MvxFragment
- ¿Cómo puedo implementar el desplazamiento horizontal sin utilizar la biblioteca de soporte?
- Añadir elementos a ListView - Android
- Android ListView en el ejemplo de fragmento
- Fragmentos de viewpager anidados en android 2.3.3 y 4.0
- Android Fragmento y la inyección de dependencia
- ¿Cuándo se debe llamar a RemoveStickyEvent (...)?
- Vista en el paginador de vistas superposición entre vistas anterior y siguiente
También puede pasar el objeto DialogFragment
a DialogFragment
de TimePickerFragment
y DatePickerFragment
.
A continuación se muestra un resumen.
Cree el constructor de DatePickerFragment
como parámetro de TextView
y establezca la fecha en ese 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)); } }
¿Cómo pasar la vista de texto?
DialogFragment newFragment = new DatePickerFragment(textDate); newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
Igual que para TimePickerFragment
DialogFragment newFragment = new TimePickerFragment(textTime); newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
Trate de implementar su oyente en Fragment1 vez puesto que su texto está en la vista fragment1.
Sentido
public class Fragment1 implements OnDateSetListener{ // Your regular methods and codes @Override public void onDateSet(DatePicker picker, int year, int month,int day) { 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); } }
Si necesita la fecha de su fragmento en su actividad puede codificar un getmethod en su fragmento
public String getDate(){ return textDate.getText(); }
El ejemplo sólo muestra para DatePicker, pero estoy seguro de que son capaces de hacer lo mismo para TimePicker.
Aclamaciones