Android ClassCastException从SFragment到SFragmentActivity

Android ClassCastException从SFragment到SFragmentActivity,android,actionbarsherlock,classcastexception,Android,Actionbarsherlock,Classcastexception,我仍然无法100%理解上下文、活动、片段等的概念/差异,请耐心等待 在SherlockFragment中调用getActivity()时,我得到了一个ClassCastException(注意:我还尝试了getSherlockActivity(),但没有成功): MyActivity扩展了SherlockFragmentActivity,异常发生在TaskGrabbingFragment中,但是getActivity()返回AllTasksTabFragment,这是一个SherlockFrag

我仍然无法100%理解上下文、活动、片段等的概念/差异,请耐心等待

在SherlockFragment中调用getActivity()时,我得到了一个ClassCastException(注意:我还尝试了getSherlockActivity(),但没有成功):

MyActivity扩展了SherlockFragmentActivity,异常发生在TaskGrabbingFragment中,但是getActivity()返回AllTasksTabFragment,这是一个SherlockFragment。那么,是否有一些规则禁止在SherlockFragmentActivity中使用SherlockFragments?有什么样的解决方案可以将片段强制转换为片段活动?

getActivity()返回AllTasksActivity,而不是AllTasksTabFragment。
getActivity()返回与当前片段关联的活动。您应该检查TaskGrabbingFragment是否与AllTasksActivity或MyActivity关联。

以下是我脑海中的一些基本理论,如果您能纠正其中的一些缺点,我将不胜感激:

上下文
是用来理解某些逻辑在何处执行的基本要素。最常见的
上下文
应用程序
活动
服务
,这意味着不同类型(级别,如果需要)的
上下文

应用程序
类允许您在任何程序组件中为应用程序提供资源,该程序组件引用它,因为它代表全局(应用程序)上下文

服务
是一个程序组件,允许您在后台执行某些逻辑

活动
是用户在某一时刻与之交互的主要UI单元。它基本上用于提供GUI组件,如
View
s

如今,运行Android的设备种类繁多。这就是为什么在开发应用程序时会出现碎片问题,而应用程序应该尽可能在大多数设备上执行

作为这一问题的解决方案之一,Android在其框架中提供了
片段
类,其作用类似于UI的可重用容器,并通过
活动
的生命周期与
活动
类紧密绑定。一个
活动
可能包含大量
片段
s,并有一个与之相关联的后堆栈

最近,Android开发者提供了一个机会来创建嵌套片段-片段,因此一个
片段
可以作为其他片段的容器。但与
活动
相反,
片段
没有为嵌套片段返回堆栈

你的问题好像你认为<代码>片段<代码>是<代码>上下文< /代码>,当不是这样的时候。代码>片段只是一个普通的对象-容器,-可以通过它所附加的

活动
提供给用户

奇怪的是,
getActivity()
方法返回一个
片段
,因为它是最后一个方法,应该返回一个
Activity
对象


问题可能隐藏在您的代码中,您将
片段
添加到
活动

中,然后首先您必须理解上下文、活动、片段等的概念。感谢您的建议。你是建议我在提问前100%掌握这门学科?你是对的,它会返回AllTasksActivity,噢。但这有关系吗?AllTasksActivity和MyActivity都扩展了SFragmentActivity,这不允许我将AllTasksActivity强制转换为MyActivity吗?不,它只允许您将其强制转换为AllTasksActivity或SFragmentActivity。在“铸造对象”部分下面有一个很好的解释:谢谢你的信息!不过,我在上面犯了一个错误:getActivity()返回AllTasksActivity,它扩展了SFragmentActivity,因此可能会使您误入歧途。然后您进行了错误的施法。这些活动扩展了同一个类,但它们是两个不同类的实例。你能做的唯一一件事就是像处理抽象表示一样处理它们,
sffragmentactivity
,而不是使用具体的类转换。顺便说一句,在您的情况下,为什么需要将其转换为特殊类型的
SFragmentActivity
-MyActivity`?
public abstract class TaskGrabbingFragment extends SherlockFragment {
...
    protected void transferGroupToMe() {
    ...
        Backend.getInstance().modifyTask(new OnModifyTaskResponse() {
            @Override
            public void onModifyTask(Map<String, Object> response) {
                refresh();
            }
        }, (MyActivity) getActivity(),  //ClassCastException
        TaskHelper.TASK_IDS, ids,
        TaskHelper.EMPLOYEE_ID, DomaCareBackend.getInstance().getUserId());
    }
}
FATAL EXCEPTION: main
java.lang.ClassCastException: com.mycom.task.AllTasksActivity cannot be cast to com.mycom.myapp.MyActivity
at com.mycom.myapp.task.TaskGrabbingFragment.transferGroupToMe(TaskGrabbingFragment.java:69)
at com.mycom.myapp.task.TaskGrabbingFragment.onContextItemSelected(TaskGrabbingFragment.java:47)
at android.support.v4.app.Fragment.performContextItemSelected(Fragment.java:1583)
at android.support.v4.app.FragmentManagerImpl.dispatchContextItemSelected(FragmentManager.java:1992)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:370)
at com.actionbarsherlock.app.SherlockFragmentActivity.onMenuItemSelected(SherlockFragmentActivity.java:211)