要使用getSherlockActivity()或getActivity()或其他?

时间:2013-06-06 09:00:54

标签: android actionbarsherlock

我有一个带TabManager的Android应用程序。由于Android API的更改,我需要升级我的应用程序以包含片段。为了提供向后兼容性,我使用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 个答案:

答案 0 :(得分:2)

唯一的区别是,使用getSherlockActivity (),您获得了getActivity()的结果,但是将其作为SherlockActivity投放。这允许访问ABS特定的api。

如果您只需要一般性的内容,而不是Activity类,请使用getActivity()。它将突出显示这一点,否则突出显示您使用getSherlockActivity ()使用ABS特定的内容。

NPE可以来自:

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

因此解决方案是在使用其活动之前检查您的片段是否已连接:

if( isAttached() ) {
   getActivity()....
}

答案 1 :(得分:2)

Same topic

NullPointerException是normally

  

警告:如果片段中需要Context对象,则可以调用getActivity()。但是,只有在片段附加到活动时才要小心调用getActivity()。当片段尚未附加,或在其生命周期结束时被分离时,getActivity()将返回null。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

getSherlockActivity只是一个快捷方式:

(SherlockActivity) getActivity()

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