Cómo separar la actividad principal y el selector de fechas con las propias clases

Esta pequeña cosa comenzó a frustrarme mucho. Pensé que era algo simle a hacer, pero creo que no he entendido claramente cómo android funciona.

De todos modos, el problema es que mi aplicación Android tendrá algunos botones que se abrirá un cuadro de diálogo de fecha o hora selector cuando se presiona. Sé cómo implementarlos directamente en la misma clase que la actividad principal en sí, pero no creo que sea una buena solución por razones de mantenimiento y también si voy a desarrollar esa aplicación algún día más.

Traté de hacer esto de varias maneras diferentes y falló cada vez que traté de hacerlo. Eso me dejó bastante clueless de qué hacer y cuál es el problema.

He aquí una manera en la que intenté hacer esto:

La actividad principal (la simplifiqué y traté de proporcionar sólo el código necesario, porque es largo). Esto es siguiendo el patrón de diseño singleton.

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); dateButton = (Button) findViewById(R.id.editDateButton); dateButton.setOnClickListener(this); } @Override public void onClick(View view) { if(view.getId() == R.id.editStartDateButton) { DatePickers.getInstance().setDate(dateButton); } } 

La clase de selectores de fechas (extiende Actividad, también código simplificado y todas las cosas innecesarias eliminadas):

 private static DatePickers self = null; public static DatePickers getInstance() { if (null == self) { self = new DatePickers(); } return self; } public void setDate(Button button) { theButtonUsed = button; showDialog(DATE_DIALOG_ID); } 

Después de la llamada showDialog la clase es similar al ejemplo Hello-DatePicker en el sitio de desarrollo de android.

También intenté hacerlo casi como aquí , pero con el differnece que cuando se hace clic en el dateButton se inicia la nueva actividad que es el cuadro de diálogo selector de fecha. En este caso la clase datePicker fue así:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.datePicker); showDialog(DATE_DIALOG_ID); } 

Y el resto, ya que está en el ejemplo de Hello-DatePicker en el sitio de desarrollo de Android. Ambas soluciones conducen a un problema en el que mi aplicación se estrelló y se vio obligada a abandonar.

Espero que entiendas cuál es el problema y que puedes guiarme y mostrar lo que estoy haciendo mal. Traté de hacer esta breve y proporcionar sólo la información necesaria.

Gracias -Z

Editar:

Como he mencionado en uno de los comentarios, el verdadero problema con esto es que simplemente me he olvidado de agregar la nueva actividad al archivo de manifiesto. Podría haber habido otros problemas que se resolvieron con la respuesta aceptada. Espero que esto siga siendo útil para cualquiera que tenga problemas similares.

Creo que puedo ayudarte.

Sé que mi solución no va a seguir su enfoque singleton, pero definitivamente separa el código de DatePicker de la actividad o actividades de llamada – que a su vez se vuelve modular y limpio.

Así que aquí va: Abajo está el código designado de DatePicker (lo llamé DateSelector). Inicia esta activityForResult y devolverá un lote con Day, Month y Year a la actividad de llamada.

También voy a pegar el diseño simple que DateSelector usa justo debajo de él; Es solo un diseño transparente …

 package com.cyberfabric.historicise.activities; import java.util.Calendar; import com.cyberfabric.historicise.R; import android.app.Activity; import android.app.DatePickerDialog; import android.app.Dialog; import android.content.Intent; import android.os.Bundle; import android.view.Window; public class DateSelector extends Activity{ private final static int DIALOG_DATE_PICKER = 0; private int setYear; private int setMonth; private int setDay; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.date_picker); Calendar today = Calendar.getInstance(); setYear = today.get(Calendar.YEAR); setMonth = today.get(Calendar.MONDAY); setDay = today.get(Calendar.DAY_OF_MONTH); showDialog(DIALOG_DATE_PICKER); } @Override protected Dialog onCreateDialog(int id){ switch(id){ case DIALOG_DATE_PICKER: return new DatePickerDialog(this, mDateSetListener, setYear, setMonth, setDay); } return null; } private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener(){ @Override public void onDateSet(android.widget.DatePicker view, int year, int month, int day) { setYear = year; setMonth = month; setDay = day; returnDate(); } }; /* * Package up the data and return it back to the calling intent */ private void returnDate(){ Intent intent = getIntent(); // calling/parent intent // Bundle bundle = new Bundle(); bundle.putInt("year", setYear); bundle.putInt("month", setMonth); bundle.putInt("day", setDay); intent.putExtra("set_date", bundle); setResult(Activity.RESULT_OK, intent); finish(); } } 

Aquí está el diseño que utiliza DateSelector:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/transparent" /> 

La actividad o actividades de su llamada debe iniciar DataSelector como tal:

 // some global variable declared in order to start activityForResult and to catch // it back on onActivityResult private final static int REQUEST_GET_DATE = 3; 

Inicio del DateSelector de la actividad de llamada:

 Intent dp = new Intent(EventForm.this, DateSelector.class); EventForm.this.startActivityForResult(dp, REQUEST_GET_DATE); 

Y, finalmente, en su actividad de llamada sólo cogerlo onActivityResult:

 protected void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); switch(requestCode){ case REQUEST_GET_DATE: if(resultCode == Activity.RESULT_OK){ Bundle setDate = data.getBundleExtra("set_date"); int setDay = setDate.getInt("day"); int setMonth = setDate.getInt("month"); int setYear = setDate.getInt("year"); System.out.println(setDay + " " + setMonth + " " + setYear); } break; } } 

Espero que esto ayude, espero que les guste,

Mejor,

Siciano

  • Clase de Aplicación SingleTon de Kotlin
  • Java Singleton + clase interna mal entendida
  • Singleton objeto está recreando
  • Acceso al objeto GoogleApiClient en Todas las actividades
  • ¿Por qué la clase singleton sobrevive a la actividad?
  • La forma más segura de usar SharedPreferences
  • Ampliación de la clase de aplicación y buenas prácticas
  • Métodos estáticos o singleton, ¿cuál elegir?
  • Variables estáticas, patrón y rendimiento de Android
  • Uso del patrón de diseño Singleton para SQLiteDatabase
  • Singleton se destruye
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.