我仍然感到困惑,因为Google在Android API中放置了一种有时有效但有时无效的方法;即Fragment.getActivity()
。我知道,我可以检查结果是否为null
,还有isAdded()
方法。但是,如果这些检查结果为否,我应该如何进行?到目前为止,我有一个原因想要访问Activity
,例如访问Resources
或Preferences
或执行需要{{1} }。
我根本无法做我想做的事。但是,我认为如果我的App有时执行用户选择的操作,有时不执行用户选择的操作,那将是糟糕的用户体验。实际上,我认为让我的应用程序崩溃不会更糟。
或者我可以告诉用户有关超脱活动的信息,他应该稍后再试。但是,等等,Context
需要一个Toast
,所以我什至不能这样做。
还是我应该等待活动重新连接?
Context
(我没有认真建议,我只想说明自己有多么绝望)
也许我在想这一切错。也许我正在尝试以错误的方式做事。也许有一个关于如何使用我从未听说过的片段的流派。但是,如果我应该避免在Activity activity = getActivity();
while (activity == null) {
Thread.sleep(10);
activity = getActivity();
}
中访问Activity
,为什么首先要使用Fragment
方法呢?
我现在正苦苦挣扎的一个特殊问题是,在getActivity()
中的PreferenceFragment
中,我想向用户发送OnSharedPreferenceChangeListener
消息:
Toast
大部分时间都可以使用,但是有时会崩溃,因为Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
返回了getActivity()
。
答案 0 :(得分:1)
在通常情况下,一旦附加,您将始终在片段中包含活动,因为仅当片段被销毁后,活动才会分离(并且永远不会重新附加)。请参见https://developer.android.com/guide/components/fragments上的Android片段生命周期图。 我能想到的唯一问题是,当您使用另一个线程或发布带有引用Fragment的回调的Runnable时。在这种情况下,可以在Fragment分离并销毁后调用该回调。现在,通常在那种情况下,您想转储您正在做的事情,然后退出,因此只需检查getActivity是否为null而不执行任何操作。如果即使Fragment被销毁也必须做某事,那么如果仅需要资源等上下文,则可以安全地使用ApplicationContext,可以在应用程序的生命周期中安全地使用它。如果您需要UI的Context(例如向用户显示Toast),则ApplicationContext将不起作用。在这种情况下,您将不得不重新设计代码,使Activity是处理回调和函数的代码,而不是Fragment。所有这些都假设该活动仍然存在。
答案 1 :(得分:-1)
使用getContext()
代替getActivity()
。
getContext()
返回应用程序上下文,该上下文将一直保留到应用程序运行为止。
答案 2 :(得分:-1)
首先在您的片段中定义
YourActivity mContext;
然后 在您的片段中覆盖
@Override
public void onAttach(Context context) {
mContext = (YourActivity) context;
super.onAttach(context);
}
并使用mContext代替getActivity()