2012-08-23 20 views
7

Estoy usando este código para saltar de nuevo en la pila de la actividad (sobre todo para pasar a la actividad principal):cómo etiquetar Actividad

Intent goTo = new Intent(this, HomeActivity.class); 
goTo.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(goTo); 


lo tanto, crear nueva Intención y ajuste "objetivo" a HomeActivity que es en la pila de actividades para que toda la pila se borre desde arriba a esta actividad de inicio.
Ahora necesito un caso de uso ligeramente diferente. Tengo, por ejemplo, cinco Actividades A-B-C-D-E (A comenzó B, etc.) en la pila. Ahora necesito saltar de E a C o B dependiendo de lo que elija el usuario. El problema es que las Actividades A, B, C, D, E tienen la misma clase. Entonces no puedo usar el ejemplo anterior porque no sé cómo enfocar esa actividad.
Entonces la pregunta es si hay alguna forma de cómo "etiquetar actividad" o manipular con pila.
Gracias!

+0

si A y E son iguales, en lugar de llamar a E, ¿por qué no llamas a la actividad A de la historia? – Ishtiaq

+0

He editado mi pregunta para que quede más clara. Todas las actividades tienen la misma clase. – Warlock

+0

No puedo entender su problema. Por favor dime, ¿qué es malo? –

Respuesta

0

El mejor y la solución más fácil (hasta ahora) será Fragmentos de uso y FragmentManager. Luego marque cada Fragmento y use FragmentManager. Usar solo Actividad puede ser muy difícil de tener casi el mismo resultado.

+0

¡Mencioné esto en mi respuesta! :) – Joe

+0

Su enfoque es muy diferente. ¡Pero gracias por esa idea! ;-) – Warlock

1

Puedes seguir una condición en su estado de cuenta si el usuario opta por este artículo pasar intención de clase B y si el usuario decide que el artículo pasar intención de clase C

+0

El problema es que todas las actividades tienen la misma clase. – Warlock

1

Añadir extra a su intención de que apuntará la actividad qué hacer. Por ejemplo

intent.putExtra("STATE", 1); 

Y obtener este valor en onCreate de su actividad.

getIntent().getExtras() 
+0

La única forma de usar este enfoque es combinarlo con startActivityForResult/onActivityResult, etc. pero esperaba que hubiera una manera más simple de hacerlo. Puedo tener diez actividades como se mencionó anteriormente, así que onActivityResult se llamará muchas veces ... – Warlock

+0

Si el problema principal es la misma clase para todas las actividades, la solución puede ser simple. Haz una clase base y luego amplíala tantas veces como necesites y crea una instancia de diferentes clases. Pero creo que es un enfoque extraño. Mejor hacer una máquina de estado simple y no reiniciar la misma actividad 100 veces ... – Dimanoid

2

no he probado a mí mismo, pero creo que la mejor opción sería la de refactorizar su aplicación para utilizar una pila de Fragment s dentro de un solo Activity (desde luego se puede administrar más fácilmente el backstack utilizando el proporcionó addToBackStack() y popBackStack() métodos). Básicamente, esto implica mover la mayor parte del código en su Actividad a un Fragmento y luego agregar el código de manipulación backstack en la Actividad). Puede ver el código para FragmentBreadCrumbs (con API 11+) o el código para HanselAndGretel (para usar con la biblioteca de compatibilidad) para ver cómo se puede implementar esto.

Sin embargo, si desea continuar utilizando su enfoque actual de múltiples actividades, el siguiente es un código que surgió para ilustrar cómo puede hacerlo.

Primero, agregue varias clases internas para alias su actividad actual y ponga estas clases en una lista de secuencias (note también el método simplista getSequencedActivityIntent() que escribí, puede agregar lógica más avanzada si necesita - tal vez use un HashMap para asociar cada clase en la secuencia con un valor de la variable arbitraria):?

public class MyActivity extends Activity { 

    public static class A extends MyActivity {} 
    public static class B extends MyActivity {} 
    public static class C extends MyActivity {} 
    public static class D extends MyActivity {} 
    public static class E extends MyActivity {} 
    public static class F extends MyActivity {} 
    public static class G extends MyActivity {} 
    public static class H extends MyActivity {} 
    public static class I extends MyActivity {} 
    public static class J extends MyActivity {} 

    private final static List<Class<?>> SEQUENCE = Arrays.asList(new Class<?>[] { 
      A.class, B.class, C.class, D.class, E.class, 
      F.class, G.class, H.class, I.class, J.class, 
    }); 

    private Intent getSequencedActivityIntent(int step) { 
     final int current = SEQUENCE.indexOf(this.getClass()); 
     if (current == -1) new Intent(this, SEQUENCE.get(0)); 

     final int target = current + step; 
     if (target < 0 || target > SEQUENCE.size() - 1) return null; 

     return new Intent(this, SEQUENCE.get(target)); 
    } 

    // the rest of your activity code 
} 

no se olvide de agregar sus entradas a su AndroidManifest.archivo XML también (singleTop es opcional - que evitará que la instancia de actividad en la pila que se creará de nuevo cuando vuelva a la parte delantera):

<activity android:name=".MyActivity$A" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$B" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$C" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$D" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$E" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$F" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$G" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$H" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$I" android:launchMode="singleTop" /> 
    <activity android:name=".MyActivity$J" android:launchMode="singleTop" /> 

Ahora, cada vez que necesita para iniciar una nueva instancia "top" de su actividad, puede hacer algo como:

final Intent intent = getSequencedActivityIntent(+1); 
    if (intent == null) return; 
    intent.putExtra("dataset", dataSet); 
    startActivity(intent); 

Y cuando se necesita para volver a uno de la instancia en el backstack que puede hacer:

final Intent intent = getSequencedActivityIntent(- stepBack); 
    if (intent == null) return; 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
1

Mientras underst y Android solo se dirige a la clase de actividad y no a una instancia particular de actividad. Por lo tanto, creo que no podrá hacer lo que quiera con solo agregar algunas banderas en Intent.

creo que el enfoque más sencillo sería implementar por su cuenta por algo como esto

a) Crear un poco de Singleton y tienen un miembro en ella lo que apunta a instancia de actividad a la que desea devolver (como se ejemplo de actividad B). Probablemente, tendrá que almacenar todas las actividades en una lista para poder obtener una instancia de alguna actividad lanzada anteriormente.

b) Anular onResume de todas las actividades y en ella hacer siguiente comprobación:

if (SomeSingleton.getTargetActivity() != null && this != SomeSingleton.getTargetActivity()) 
    finish(); 
else 
    SomeSingleton.setTargetActivity(null); 

c) Tan pronto como sea necesario para volver de E haces

SomeSingleton.setTargetActivity(B); 
finish(); 

Esto cerrará la actividad superior (que es E) y llama al Reanudar sobre la actividad D. Verificará si es el objetivo. Si no es así, lo cerrará y el sistema llamará a Repetición en la actividad C, y así sucesivamente.

2

Puede indexar sus actividades sin tener que preocuparse por el manejo de toda la cadena de onActivityResult s usando una actividad súper que se extienden en todas sus actividades

Aquí es una aplicación (no he probado) pero si extienda esta Superactividad en todas sus Actividades, puede llamar al fallBackToActivity(int) a cualquier actividad usando su índice y cada actividad ahora tiene un getIndex(). Se puede utilizar para el repliegue de un índice relativo como getIndex()-3

package sherif.android.stack.overflow; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 

public class SuperActivity extends Activity { 
    private static String EXTRA_INDEX = "SUPER_INDEX"; 
    private static int RESULT_FALLBACK = 0x123456; 
    private int index; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(getIntent()!=null) { 
      index = getIntent().getIntExtra(EXTRA_INDEX, -1) + 1; 
     } 
    } 
    protected final int getIndex() { 
     return index; 
    } 
    protected final void fallBackToActivity(int index) { 
     Intent intent = new Intent(); 
     intent.putExtra(EXTRA_INDEX, index); 
     setResult(RESULT_FALLBACK, intent); 
     finish(); 
    } 
    @Override 
    public void startActivityForResult(Intent intent, int requestCode) { 
     intent.putExtra(EXTRA_INDEX, getIndex()); 
     super.startActivityForResult(intent, requestCode); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(resultCode == RESULT_FALLBACK) { 
      if(data.getIntExtra(EXTRA_INDEX, -1)!=getIndex()) { 
       setResult(RESULT_FALLBACK, data); 
       finish(); 
      } 
     } 
    } 
} 
1

Si desea utilizar un enfoque anormal, o alguna vez complicado, tendrá más problemas más adelante. Creo que puede

Defina una subclase de actividad abstracta/no abstracta y defina todo lo que desee. Si otras clases son exactamente las mismas que la clase anterior, entonces solo haga una subclase y no haga nada más. Pero si las clases (Actividades) pueden ser diferentes entre sí, puede proporcionar métodos abstractos/no abstractos para definir habilidades adicionales.

Así

  • se escribe un código reutilizables para todas las actividades,
  • usted actúa normal, por lo que obtendrá un buen resultado
  • Usted puede controlar todo especializado en sus actividades
  • Puede controlar pila utilizando el archivo manifiesto
  • y más

para obtener información detallada véase más adelante códigos: Actividad

Padres:

public abstract class AbstractActivity extends Activity { 

    AbstractActivity currentActivity; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     currentActivity = this; 
     someProtectedMethod(); 
     commonMethod(); 
     // etc... 

     /* event handling */ 
     Button btn_first = (Button) findViewById(R.id.btn_first); 
     Button btn_second = (Button) findViewById(R.id.btn_second); 

     btn_first.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(currentActivity, FirstActivity.class); 
       currentActivity.startActivity(intent); 
      } 
     }); 

     btn_second.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(currentActivity, SecondActivity.class); 
       currentActivity.startActivity(intent); 
      } 
     }); 

    } 


    /** you must override it, so you can control specified things safe */ 
    protected abstract void someProtectedMethod(); 


    protected void commonMethod() { 
     Log.i("LOG", "Hello From " + getClass().getName()); 
    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     //some statement that work in all activities to 
     Log.i("LOG", "On Resume: " + getClass().getName()); 
    } 
} 

Primera Actividad:

public class FirstActivity extends AbstractActivity { 

    @Override 
    protected void someProtectedMethod() { 
     Log.i("LOG", "Special Action From First Activity"); 
    } 
} 

Segunda Actividad:

public class SecondActivity extends AbstractActivity { 

    @Override 
    protected void someProtectedMethod() { 
     Log.i("LOG", "Special Action From Second Activity"); 
    } 
} 

main.xml:

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


    <Button 
     android:id="@+id/btn_first" 
     android:layout_width="0dip" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.5" 
     android:text="Open First Activity" /> 

    <Button 
     android:id="@+id/btn_second" 
     android:layout_width="0dip" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.5" 
     android:text="Open Second Activity" /> 

</LinearLayout> 

Manifiesto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.activity_control" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="7" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".FirstActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity 
      android:name=".SecondActivity" 
      android:label="@string/app_name" > 
     </activity> 

    </application> 

</manifest> 
Cuestiones relacionadas