2012-01-11 17 views
61

Es necesario crear una clase base que se extiende Activity, que hace algunas tareas comunes en mi aplicación y ampliar mis actividades de ella, de la siguiente forma:android cómo crear mi propia actividad y ampliarla?

BaseActivity pública se extiende Actividad {....}

subactividad pública se extiende BaseActivity {...}

en subactividad necesito para dar valores a algunas variables y componentes de interfaz de usuario definidas en BaseActivity, I puede necesitar para definir un diseño diferente para subactividad de acuerdo con algún valor de indicador, también (en subactividad) Quiero ejecutar AsyncTask que se define en BaseActivity.

¿Esto es posible? Si es así, ¿hay algún tutorial que pueda ayudar? gracias de antemano

Respuesta

127

¿Qué estás tratando de lograr exactamente? ¿Tiene dos actividades diferentes con una interfaz de usuario común, a excepción de algunas variables o partes del diseño?

En este caso, sugiero tener una actividad abstracta de base y dos subclases heredadas concretas. Define todo el comportamiento común en la actividad base y tiene métodos abstractos para las diferencias, que luego anula en sus implementaciones reales.

Por ejemplo, para dos actividades con diferentes recursos de Presentación:

public abstract class BaseActivity extends Activity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(getLayoutResourceId()); 
    } 

    protected abstract int getLayoutResourceId(); 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // do extra stuff on your resources, using findViewById on your layout_for_activity1 
    } 

    @Override 
    protected int getLayoutResourceId() { 
     return R.layout.layout_for_activity1; 
    } 
} 

Puede tener una gran cantidad de métodos más abstractos, para cada bit que desee específico para sus subclases.

Hacer eso es, en mi opinión, mucho mejor que tener una subclase concreta a una superclase concreta: eso puede conducir a muchos problemas y generalmente es difícil de depurar.

+0

muchas gracias, esto es exactamente lo que necesitaba. – user173488

+1

No hay problema P) Tenga en cuenta que codifiqué rápidamente en el editor StackOverflow, puede haber errores de sintaxis – Guillaume

+0

gracias, tomé la idea y la apliqué a otras funciones, datos para pasar y AsyncTask en BaseActivity, funcionó bien. – user173488

5

Sí, puede, simplemente, tener en cuenta las reglas básicas de herencia. Heredará la actividad AsyncTask interna y las propiedades definidas en BaseActivity si las protege en lugar de hacerlo en privado. Por lo que veo ahora, creo que debes hacer que BaseActivity sea una clase abstracta, ya que solo se usarán instancias de subActivities.

Debería simplemente comenzar y probarlo, vendrá y funcionará más fácil de lo que cree. Si tropieza con algún problema, solo pregunte.

2

He encontrado una manera más fácil de encontrar la solución de @ Guillaume. Establecer ContentView sólo una vez en su BaseActivity y no la coloque en las actividades que se extienden que:

public abstract class BaseActivity extends Activity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(activity_main); 
    } 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // setContentView(activity_activity1) // Do NOT call this. 
    } 
} 
+1

parece legítimo, pero tengo algunas preocupaciones, el usuario tendrá que usar solo un diseño ... si tengo 3 vistas comunes en 3 actividades de diferencia, pero aparte de eso, todos los diseños son diferentes, entonces supongo que esta solución derrota al propósito.... – Juni

2

Esta cuestión ya tiene muy buenas respuestas.
Mi respuesta es para aquellas personas que están buscando algún ejemplo de trabajo.
Aquí es el pleno funcionamiento ->CODE

enter image description here
No estamos haciendo nada nuevo aquí, es como cualquier otro escenario herencia (¿Quieres un comportamiento común en varios lugares, pero desea escribir que comportamiento solo una vez).

VENTAJA: Se proporciona una mejor legibilidad del código, mantenibilidad y bla blah.But no son después de que éstos -ibility, no van a importar a usted si su cerebro funciona como una gacela.
Estamos detrás del poder real de la herencia "CONTROL". (Eso es lo que sucede en la vida real también. Padre que controla al niño :)).

En mi ejemplo tengo dos actividades MainActivity y OtherActivity. Ambas actividades tienen un diseño diferente pero quiero que ambas comiencen con alguna animación o algún mensaje de bienvenida.

Nuestra primera tarea es descubrir el comportamiento común. aquí -> Actividad de inicio con animación.
Hemos encontrado la "cosa común", ahora escribiremos ese comportamiento en BaseClass (AnimationActivity).
MainActivity y OtherActivity heredarán AnimationActivity.

Así código sería como `

BaseActivity

AnimationActivity { 

    startAnimation() 
    { 
    .... 
    } 
} 

Actividades infantiles

MainActivity extends AnimationActivity{ 

} 

OtherActivity extends AnimationActivity{ 

} 

Este enfoque de diseño proporciona una gran cantidad de Control y Flexibilidad (POTENCIA DEL MODIFICADOR).

1) Control: Mantener método de animación dentro onCreate() Cuando se decide que las actividades deben iniciarse con la animación. Mantenga su método dentro del método Crear (paquete). Ahora solo cambiando el modificador puede controlar las Actividades del niño.
Si conserva el modificador como
final: las actividades secundarias comenzarán con la animación principal.
resumen: las actividades para niños tendrán que dar su propia animación.
sin modificador: las actividades secundarias pueden tener su propia animación anulando el método de animación. De lo contrario, el niño tendrá una animación principal.

2) Flexibilidad: No mantener método de animación dentro onCreate() Puede proporcionar actividades infantiles flexibilidad al no mantener método de animación dentro onCreate (Bundle paquete). Ahora las actividades pueden tener la flexibilidad de tener Animación principal o su propia animación o ninguna animación.
Espero que ayude.
Aprendizaje feliz.

`

Cuestiones relacionadas