在片段中,如何处理独立活动?

时间:2019-01-11 17:57:01

标签: android android-fragments

我仍然感到困惑,因为Google在Android API中放置了一种有时有效但有时无效的方法;即Fragment.getActivity()。我知道,我可以检查结果是否为null,还有isAdded()方法。但是,如果这些检查结果为否,我应该如何进行?到目前为止,我有一个原因想要访问Activity,例如访问ResourcesPreferences或执行需要{{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()

3 个答案:

答案 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()