Android ActivityGroup-NullPointerException
android-activity (3)
no estoy seguro de cómo implementó el ActivityGroup, pero el grupo debe ser una variable estática.
Encontré este tutorial en google y se describe cómo implementar un ActivityGroup. http://blog.henriklarsentoft.com/2010/07/android-tabactivity-nested-activities/
Espero que esto ayude, tobias
Intento usar grupos de actividades, ya que utilizo pestañas y quiero tener las pestañas cuando las cargas y la actividad después de que se hizo clic en el elemento de la lista. pero estoy obteniendo nullpointerecepción en la siguiente línea:
View view1 = S1_Group.group.getLocalActivityManager()
.startActivity("S1", intent)
.getDecorView();
El código es ...
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(getApplicationContext(), S1.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Log.d("test","Before view");
try{
View view1 = S1_Group.group.getLocalActivityManager()
.startActivity("S1", intent)
.getDecorView();
Settings_Group.group.setContentView(view1);
}
catch (Exception e){
Log.e("test","view failded:"+e);
}
....
actualización: esta es la actividad de mi grupo: no pude encontrar cuál era el problema.,
public class S1_Group extends ActivityGroup {
public static S1_Group group;
private ArrayList<View> history;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.history = new ArrayList<View>();
group = this;
View view = getLocalActivityManager().startActivity("F1",
new Intent(this, F1.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
setContentView(view);
}
}
Yo tuve el mismo problema. Para resolverlo, descompuse la línea de llamadas múltiples en tres líneas, como sugería la primera respuesta:
LocalActivityManager processManager =activityGroup.group.getLocalActivityManager();
Window w = processManager.startActivity("ActivityOne", myIntent);
View view = w.getDecorView();
Luego descubrió que la primera línea es la del problema. Como llamo ActivityOne de una actividad fuera del grupo de actividades (es una actividad en una pestaña diferente), el "activityGroup.group ...." estático aún no se ha inicializado. Entonces la mejor solución es cambiar a esa pestaña y volver a esta pestaña antes de iniciar la intención. Así que agrega lo siguiente justo antes del código de arriba:
AppName.switchToTab(2);
AppName.switchToTab(1);
Eso hizo el truco y no se puede ver el interruptor de tabulación. Una solución más ordenada sería tal vez cambiar a todas las pestañas en el inicio para asegurarse de que estén todas inicializadas ...
Nos encontramos con el mismo problema y parece que hay (o hubo) un error con el LocalActivityManager que ocurre cuando estás tratando de (re) iniciar una Actividad con el mismo ID que una Actividad previamente destruida. Simplemente devolverá null como Window, debido a un error dentro del método destroyActivity. La solución alternativa que estoy usando utiliza la reflexión para destruir adecuadamente una actividad (explicación detallada después de la solución):
public boolean destroyActivityWorkAround(String id) {
final LocalActivityManager activityManager = getLocalActivityManager();
if(activityManager != null){
activityManager.destroyActivity(id, false);
try {
// Use reflection to get to the HashMaps with the records(which activities are started ect.)
// to remove the records properly
// http://code.google.com/p/android/issues/detail?id=10083
final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities");
if(mActivitiesField != null){
mActivitiesField.setAccessible(true);
@SuppressWarnings("unchecked")
final Map<String, Object> mActivities = (Map<String, Object>)mActivitiesField.get(activityManager);
if(mActivities != null){
mActivities.remove(id);
}
final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray");
if(mActivityArrayField != null){
mActivityArrayField.setAccessible(true);
@SuppressWarnings("unchecked")
final ArrayList<Object> mActivityArray = (ArrayList<Object>)mActivityArrayField.get(activityManager);
if(mActivityArray != null){
for(Object record : mActivityArray){
final Field idField = record.getClass().getDeclaredField("id");
if(idField != null){
idField.setAccessible(true);
final String _id = (String)idField.get(record);
if(id.equals(_id)){
mActivityArray.remove(record);
break;
}
}
}
}
}
}
} catch (Exception e) {
Log.e(LOGTAG, this.getClass().getSimpleName() + ".destroyActivityWorkAround() removing activity using reflection failed with error:", e);
//e.printStackTrace();
}
return true;
}
return false;
}
Esta es una solución temporal porque LocalActivityManager.destroyActivity (...) contiene un error en varias versiones de API. El método no elimina la Actividad correctamente de su HashMap ( fuente de LocalActivityManager ):
public Window destroyActivity(String id, boolean finish) {
LocalActivityRecord r = mActivities.get(id); //<-- id''s are the key''s for the HashMap
Window win = null;
if (r != null) {
win = performDestroy(r, finish);
if (finish) {
mActivities.remove(r); //--> This works on id''s not the ''r object'', this doesn''t remove anything
}
}
return win;
}
la instrucción if (finish) debe ser como se sigue para eliminar LocalActivityRecord de la actividad que se destruye:
if (finish) {
mActivities.remove(id); //--> mActivities should remove the id
mActivityArray.remove(r); //--> mActivitiesArray should remove the ''r object'' (LocalActivityRecord)
}
Aunque dicen que se está arreglando para Froyo, pero todavía lo encontré en una Samsung Galaxy S2 con 2.3.3