【问题标题】:ClassCastException from SFragment to SFragmentActivity从 SFragment 到 SFragmentActivity 的 ClassCastException
【发布时间】:2013-03-26 18:23:08
【问题描述】:

我仍然没有 100% 理解上下文、活动、片段等的概念/差异,所以请耐心等待。

在 SherlockFragment 中调用 getActivity() 时出现 ClassCastException(注意:我也尝试过 getSherlockActivity() 无济于事):

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());
    }
}

我的 logcat 输出:

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)

MyActivity扩展了SherlockFragmentActivity,异常发生在TaskGrabbingFragment,但是getActivity()返回AllTask​​sTabFragment,是一个SherlockFragment。那么是否有一些规则反对将 SherlockFragment 转换为 SherlockFragmentActivity?有什么样的解决方案可以将 Fragment 转换为 Fragment Activity?

【问题讨论】:

  • 那首先要了解上下文、活动、片段等概念。
  • 感谢您的建议。您是在建议我在提问之前 100% 掌握该主题?

标签: android actionbarsherlock classcastexception


【解决方案1】:

getActivity() 返回 AllTask​​sActivity,而不是 AllTask​​sTabFragment。 getActivity() 返回当前片段关联的 Activity。您应该检查 TaskGrabbingFragment 是否与 AllTask​​sActivity 或 MyActivity 相关联。

【讨论】:

  • 你是对的,它返回AllTask​​sActivity,哎呀。但这有关系吗? AllTask​​sActivity 和 MyActivity 都扩展了 SFragmentActivity,那不是允许我将 AllTask​​sActivity 转换为 MyActivity 吗?
  • 不,它只允许您将其转换为 AllTask​​sActivity 或 SFragmentActivity。这个article 在“铸造对象”部分下对此有一个很好的解释:
【解决方案2】:

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

Context 是一种本质,用于了解某些逻辑在哪里执行。最常见的Contexts 是ApplicationActivityService,它们表示Context 的不同类型(如果需要,可以使用级别)。

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

Service 是一个程序组件,允许您在后台执行一些逻辑。

Activity 是用户当前与之交互的主要 UI 单元。它基本上是用来提供GUI组件的,比如Views。

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

作为该问题的解决方案之一,Android 在其框架中提供了Fragment 类,该类充当 UI 的可重用容器,并且通过Activity 的生命周期与Activity 类强绑定。一个Activity 可能拥有很多Fragments,并且有一个与之关联的回栈。

最近,Android 开发人员提供了创建嵌套片段 - 片段的机会,因此一个Fragment 可以用作其他片段的容器。但与Activity 相比,Fragments 没有嵌套片段的回栈。

您的问题似乎是您将Fragment 视为Context,但事实并非如此。 Fragment 只是一个普通对象 - 容器,它可以由它所附加的 Activity 提供给用户。

奇怪的是getActivity() 方法返回一个Fragment,因为它是一个最终方法,它应该返回一个Activity 对象。

问题可能隐藏在您将Fragment 添加到Activity 的代码位置。

【讨论】:

  • 感谢您的信息!不过,我在上面犯了一个错误:getActivity() 返回 AllTask​​sActivity,它扩展了 SFragmentActivity,所以这可能会让你误入歧途。
  • 那你选错了。这些活动扩展了同一个类,但它们是两个不同类的实例。您唯一可以做的就是像使用它们的抽象表示一样使用它们 - 在您的情况下为SFragmentActivity,而不是使用具体的类转换。顺便说一句,在您的情况下,为什么需要将其转换为特殊类型的 SFragmentActivity - MyActivity`?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多