【问题标题】:FragmentActivity: Cannot cast from Fragment to derived classFragmentActivity:无法从 Fragment 转换为派生类
【发布时间】:2012-03-06 15:03:49
【问题描述】:

我正在尝试在 FragmentActivity 中使用 Fragment,如下所示:

TutViewerFragment viewer = (TutViewerFragment)    
getSupportFragmentManager().findFragmentById(R.id.tutview_fragment);

我的TutViewerFragment 扩展了Fragment。但是我收到一个错误:

无法从 Fragment 投射到 TutViewerFragment。

我真的不明白为什么会这样。为什么不能投射?

【问题讨论】:

  • 你确定 TutViewerFragment 是在扩展 Fragment 吗?
  • 我很积极。看一看:pastie.org/3534066
  • 你能粘贴你的 xml 元素吗?还有你用的是什么兼容包?
  • 你确定它扩展了正确的片段吗? android.app 一个,android.support.v4.app 一个...
  • @devconsole:你是对的!它扩展了错误的片段。该死的“组织进口”功能......

标签: android casting android-fragments


【解决方案1】:

您扩展了错误的 Fragment 类。导入android.support.v4.app.Fragment 而不是android.app.Fragment

【讨论】:

  • 或者调用getFragmentManager而不是getSupportFragmentManager
  • 谢谢@mattblang,你能否详细说明一下区别。
  • getFragmentManager 返回原生 Fragment,而 getSupportFragmentManager 返回支持 Fragment。 getSupportFragmentManager 是支持库的一部分/由支持库添加,因为它们无法更改现有方法的返回类型。
【解决方案2】:

正如devconsole在上面评论中指出的:扩展Fragment的类需要导入

android.support.v4.app.Fragment;

而不是

android.app.Fragment;

我猜这与 Android 兼容包有关。问题现已解决!

【讨论】:

    【解决方案3】:

    以防万一人们正在寻找 kotlin 等价物:

    myFragmentClass = supportFragmentManager.findFragmentById(R.id.my_fragment) as MyFindOfFragment
    

    【讨论】:

    • AS 将 'as' 标记为“此演员阵容永远不会成功”。我在每个片段中导入 android.support.v4.app.Fragment。
    【解决方案4】:

    正如 devconsole/igor 所指定的,我们需要确保两个类中使用的 Fragment 类相同。 即两者中的 andorid.app.Fragment

    public class WorkoutDetailFragment extends Fragment
    

    在我们尝试获取片段引用的 Activity 类中。

    WorkoutDetailFragment workoutDetailFragment = (WorkoutDetailFragment)getFragmentManager().findFragmentById(R.id.detail_frag);
    

    确保两个文件中的相同 Fragment 类将解决类转换异常。

    希望这会有所帮助。我知道有点晚了。我是 Android 新手,正在探索美妙语言的细微差别。感谢 Stackoverflow 帮助我解决了这些小问题。

    【讨论】:

      【解决方案5】:

      如果您收到此信息并正在导入 android.support.v4.app.Fragment,请检查您是否使用了 supportFragmentManager 和 fragmentManager。

      科特林:

      //DO
      import android.support.v4.app.Fragment
      
      myFragment = supportFragmentManager.findFragmentById(R.id.my_fragment) as MyFragment
      
      //DON'T
      import android.app.Fragment
      
      myFragment = fragmentManager.findFragmentById(R.id.my_fragment) as MyFragment
      

      Java:

      //DO
      import android.support.v4.app.Fragment
      
      myFragment =(MyFragment) getSupportFragmentManager().findFragmentById(R.id.my_fragment)
      
      //DON'T
      import android.app.Fragment
      
      myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.my_fragment)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-22
        • 2016-06-25
        • 1970-01-01
        • 2019-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多