2

我有一个带有 TabManager 的 Android 应用程序。由于 Android API 的更改,我需要升级我的应用程序以使 Activity 包含 Fragment。为了提供向后兼容性,我使用 ActionBarSherlock。

我的应用程序运行良好。但是,查看 Google Play 开发者控制台,总是很少有关于 getSherlockActivity() 行的“java.lang.NullPointerException”的崩溃报告,我认为只有不到 0.1% 的用户受到影响。

例如,

// Example 1    
File file = new File(getSherlockActivity().getCacheDir(), "filename");
// Example 2
getSherlockActivity().setSupportProgressBarIndeterminateVisibility(false);

我的问题: 1. 我应该将所有 getSherlockActivity() 更改为 getActivity() 吗?还是在某些规则下,必须使用其中之一?2. 它们有什么区别?

非常感谢。

4

4 回答 4

2

唯一的区别是getSherlockActivity ()你得到的结果,getActivity()但被转换为一个 SherlockActivity。这允许访问 ABS 特定的 API。

如果您只需要在Activity课堂上足够通用的东西,只需使用getActivity(). 它将突出显示这一点,否则会突出显示您使用 ABS 特定的东西的事实getSherlockActivity ()

NPE 可以来自:

  • getActivity()在执行 onAttach 之前使用(或兄弟姐妹...)
  • getActivity()在 onDetach 执行后使用(或兄弟姐妹...)

所以解决方案是在使用它的活动之前检查你的片段是否已附加:

if( isAttached() ) {
   getActivity()....
}
于 2013-06-06T09:04:55.497 回答
2

同一主题

NullPointerException通常是

注意:如果您需要在 Fragment 中包含 Context 对象,您可以调用 getActivity()。但是,请注意仅当片段附加到活动时才调用 getActivity()。当片段尚未附加或在其生命周期结束时被分离时,getActivity() 将返回 null。

于 2013-06-06T09:07:47.033 回答
1

此异常可能意味着当片段未附加到活动时正在执行代码。

getSherlockActivity() 返回的引用在附加 Fragment 时设置,然后在分离 Fragment 时清除(设置为 null)。如果您的代码尝试在此之前或之后引用 getSherlockActivity(),您将获得一个空指针。

于 2013-06-06T09:07:21.537 回答
0

getSherlockActivity只是一个捷径:

(SherlockActivity) getActivity()

因此,在您的情况下,在示例 1 中使用没有问题, getActivity()但在示例 2 中它不起作用,因为它是 SherlockActivity 的一种方法。

于 2013-06-06T09:08:20.683 回答