2015-11-06 62 views
0

我有一个MainActivity类(扩展了AppCompatActivity)。在这个类中创建一个NavDrawerFragment(扩展Fragment)mNavigationDrawerFragment。从另一个活动引用活动的属性

然后有一个WpFragment,它是从选择mNavigationDrawerFragment的其中一个选项开始的。这个WpFragment启动一个AsyncTask WpGetTask。在点击事件中,片段启动WpDetailActivity。在特殊情况下,WpGetTask启动WpDetailActivity。

如果我现在选择WpDetailActivity中的home符号,主活动的mNavigationDrawerFragment()。openDrawer()应该会发生。我通过使用一个静态类并保存了mNavigationDrawerFragment,这对我有用,但当另一个用户从WpDetailActivity引用了静态类的mNavigationDrawerFragment时,它会得到一个NullPointerException。

有什么不同的方法可以从WpDetailActivity中调用MainActivity的mNavigationDrawerFragment?

回答

1

您不应该假设FragmentActivity中的数据会比可见的持续时间更长 - 它们不能保留。 A Fragment可以访问Activity附加的变量,但仅在其生命周期中,并且仅在附加到Activity时。

如果您希望通过Activity访问数据,那么您应该将数据传递给Intent或者使用数据存储(如SharedPreferences)。

您还有其他选择,但这里的问题基本上是,一旦Activity对用户不可见,Android可能会销毁它并在需要时重新创建它。这就是当你尝试访问Activity中的静态(或非静态)类/方法/变量时,有时会得到NPE的原因。

编辑:

阅读活动的 “流程生命周期”:

http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle

“#3” 中明确指出的Android可以 “安全地杀死它的进程。”这不是要求,这是一种可能性。这意味着,对于一个稳定的应用程序,您应该确保它确实发生并据此进行规划。

+0

如果选择了Home符号,我现在尝试在WpDetailActivity中保存一个静态布尔值。 MainActivity中的onCreate()读取此静态布尔值,并且在重新激活时应该做出反应。但没有任何反应。所以我想从WpDetailActivity返回主页后不会重新创建MainActivity。 – user2561735

+0

这是可能的。 Android不能保证它会杀死它,但正如你在你的问题中所述,它可能发生在某些设备上或其他任何设备上。看我的编辑。 – Jim

0

我不知道如何重新生成您的special,也没有您的代码。所以这个问题很难确定。

关于您的情况,我的理解是:您需要从WpDetailActivity右侧打开抽屉?如果是这样,我建议你使用eventbus,发送和事件总线通知给MainActivity并调用drawerFragment的openDrawer()方法,希望这会对你有所帮助。

相关问题