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.
- Android: No se puede realizar esta operación porque se ha cerrado el grupo de conexiones
- Fragmento no UI vs Singleton
- Las referencias estáticas se borran - Android descarga clases en tiempo de ejecución si no se utiliza?
- Android Volley error en getInstance (este) al agregar ImageLoader
- Servicio de Android Creación de una nueva instancia de clase Singleton
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.
- Android: una vs muchas instancias de HttpClient por aplicación
- ¿Es seguro guardar una referencia a un hilo en un singleton?
- Una instancia de MediaPlayer de Android: singleton
- ¿Cuál es la diferencia entre "nuevo A ()" y "A.newInstance ()"?
- Singletons vs. Contexto de la aplicación en Android?
- Excepción de puntero nulo durante la instrucción 'monitor-enter v1'
- Tiempo de vida único estático en Android
- Android: Singleton que se utiliza entre Actividad y Servicio
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
- Colores de botones personalizados para discapacitados y habilitados
- Android: Compartir hermano Vistas estado presionado