我的MainActivity调用另一个需要访问MainActivity某些成员的ActivityA。
将对主活动(或其上下文)的引用发送给活动A的最佳方法是什么,而不求助于诸如包裹等的复杂方法?
有一些重量级的android摔跤比赛here,但我不确定这与我的问题有关。
细节
我有一对多关系的Alert和Alerted对象(Alerted代表Alert响动的不同时间)。
AlertsListActivity扩展了ListActivity,它显示了SQLite数据库表中的Alert对象的列表(主键:alertId)。它具有一个AlertsListAdapter。
AlertedsListActivity有一个ListFragment,它显示Alerted表中的Alerted对象的列表(外键是Alert表中的alertId)。
它具有AlertedsListAdapter。
AlertsListActivity需要调用AlertedsListActivity来显示被警报对象的列表。我使用了startActivityForResult()。
内部AlertssListAdapter
public View getView(int position, View convertView, ViewGroup parent) {
final Alert alertItem = (Alert) mainActivity.alertsListAdapter.getItem(position);
final Alerted alertedItem = (Alerted) getItem(position);
...
我还需要Alert对象,以便在每个Alerted列表项中显示它们的一些标识信息。因此,我需要引用
mainActivity.alertsListAdapter
AlertssListActivity如何访问AlertsListActivity?
更新:由于我没有任何解决方案,因此我实施了一种解决方法。我修改了需要从主要活动访问的数据。因此,将Alert对象设置为可拆分的,将SQLOpenHelper设置为单例。
这允许从活动A访问数据。
最佳答案
这是简单,常用的方法:
单例通常具有如下示例所示的变量“ useThisContext”或“ mainFeedIsHere”。
public class Cloud
{
private static Cloud ourInstance = new Cloud();
private Cloud() { Utils.Log("cloud singleton launched"); }
public synchronized static Cloud getInstance()
{
return ourInstance;
}
/////////////////////////////////////////////////
public Context useThisContext;
另一个例子 ...
public class Feed
{
private static Feed ourInstance = new Feed();
private Feed()
{
Utils.Log("feed singleton launched");
freshestPostsForDisplay = new ArrayList<ParseObject>();
}
public synchronized static Feed getInstance()
{
return ourInstance;
}
public List<ParseObject> freshestPosts;
public MainActivity mainFeedIsHere;
很简单,当一切启动(或更改)时,这些“事物”需要在单例中设置这些变量。换句话说,这些东西“告诉单身人士,他们在哪里”。就这么简单。
因此,在MainActivity中,也许在onCreate中,它可能表示类似...
CLOUD.useThisContext = this;
FEED.mainFeedIsHere = this;
然后例如在Feed.java中,您可能会说
mainFeedIsHere.feedReload();
毋庸置疑,您必须检查它们是否不为null(但是还有其他可能吗?),并且必须保持它们为最新。 (即,无论出于何种原因,您可能想更改“ useThisContext”-再次可能是什么?)
{有时候,您将有一个“集中式”单身人士。也许是“州”……将所有这些都组合在一起-这样任何人都可以根据需要“进入”任何这些“公开的”事物。实际上,这就是游戏引擎的运行方式。这样您就可以随时随地说更多或更少的SoundEffects.Booms()或Tanks.Faster()或AI.FindVillains()。}
干杯!