Android无法访问父Activity中的值

时间:2015-05-28 10:31:50

标签: android android-activity

在我的应用程序中,我有下一个活动结构:

C ---> B ---> A

在活动A中,我持有一个值,例如,这是一个全局HashMap的值。

从活动C开始新的活动D扩展B,因此结构转换为:

   А
   |
   B
  / \
 C   D

当我这样做时 - 活动A被重新创建,我丢失了我存储在那里的所有数据(或者创建了新的活动对象?)

我与A的{​​{3}}一起玩,但我没有结果。

如何启动新活动并访问父活动中的对象?

1 个答案:

答案 0 :(得分:-1)

工作解决方案。从子活动访问父对象。

当您启动新活动时,应用程序会在已启动的Activity中创建新实例(新对象),并在其层次结构中创建新的Activity实例。

   А
   |
   B
  / \
 C   D
  

我想从C和D中读取A的对象    A,B,C,D - 活动。

尝试启动活动D.

  

startActivity(this,D.class)

onCreate D
onCreate B
onCreate A

所以,我找到了一个让开发人员生活更轻松的解决方案(我认为)。

我在做什么?

查看Application类描述:

  

需要维护全局应用程序状态的基类。

好的,这正是我需要的。但我不想避免施法;(到处申请和获取价值。

阅读更多内容...并查看this回调。

abstract void   onActivityCreated(Activity activity, Bundle savedInstanceState)
abstract void   onActivityDestroyed(Activity activity)
...

我有个主意。

在您的Application类中:

private HashMap<Department,ArrayList<Person>> departments;

@Override
public void onCreate()
{
    super.onCreate();

    // initialize your global object
    departments = new HashMap<Department,ArrayList<Person>>();

    // fill map
    departments.put(...);
    ...
    departments.put(...); 

    // register callbacks
    registerActivityLifecycleCallbacks(this);
}

创建注释

/**
 * Created by Sergey Shustikov (pandarium.shustikov@gmail.com)
 */
@Target(value= ElementType.FIELD)
@Retention(value= RetentionPolicy.RUNTIME)
public @interface InjectObject {

}

在您的活动中标记值

public class A extends Activity {

    @InjectObject
    public HashMap<Department,ArrayList<Person>> departments;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }
}

public class B extends A {

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }
}

public class C extends B {

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        startActivity(this, D.class);
    }
}

public class D extends B {

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ArrayList<Person> persons = new ArrayList<Person>();
        persons.add(new Person("John Smith"));
        departments.put(new Department("Google"), persons);
    }
}

最后一个(魔术:) :):

在Application类中:

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState)
{
    Field[] fields = activity.getClass().getFields();
    for (Field field : fields) {
        if (field.isAnnotationPresent(InjectObject.class)) {
            field.setAccessible(true);
            try {
                if (field.get(activity) == null) {
                    // Inject object
                    field.set(activity, departments);
                }
            } catch (IllegalArgumentException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(String.format("Unable to access field %s.", field.getName()), e);
            }
        }
    }
}
  

之后,您可以从A扩展任何活动并获得可共享的HashMap。

这是怎么回事?

当你开始一个新的活动时,应用程序类会抓住它。在这里我们使用反射来注入对象。就是这样。