【问题标题】:Cannot convert from android.support.v4.app.Fragment to android.app.Fragment无法从 android.support.v4.app.Fragment 转换为 android.app.Fragment
【发布时间】:2012-02-18 02:01:23
【问题描述】:

我正在开发我的第一个 Android 应用,并且想直接使用 ICS API。到目前为止,我已经使用 ActionBar 创建了一个应用程序,并带有使用 Viewpager 和 Fragments 的可滑动标签。

但是,我确实遇到了一些我不断返回的错误。

根据我的实现方式,它总是会返回“类型不匹配”错误:“无法从 android.support.v4.app.Fragment 转换为 android.app.Fragment”。我已经尝试删除任何一个的所有导入引用,当我只在 TabListener、FragmentActivity 和我的两个 Fragment 中使用 android.support.v4.app.Fragment 时会出现此错误。

错误发生在我的 TabListener 中:

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.util.Log;

public class TabListener implements ActionBar.TabListener {
    private android.app.Fragment fragment;
    private Activity activity;
    private ViewPager pager;
    private FragmentTransaction ft;

    public TabListener(Activity activity, Fragment fragment, ViewPager pager) {
        this.activity = activity;
        this.fragment = fragment;
        this.pager = pager;
    }

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft){     
        if (fragment == null) {
            ft.add(fragment, null);
        } else {
            ft.attach(fragment);
        }
    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft){
        // TODO Auto-generated method stub
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft){
        // TODO Auto-generated method stub  
    }
}

通过删除“android.app.FragmentTransaction ft”,将其替换为“FragmentTransaction ft”,问题就解决了。然后新的问题出现了:

TabListener 类型的 onTabReselected(ActionBar.Tab, FragmentTransaction) 方法必须重写或实现超类型方法 TabListener.java

TabListener 类型的 onTabSelected(ActionBar.Tab, FragmentTransaction) 方法必须重写或实现超类型方法 TabListener.java

TabListener 类型的 onTabUnselected(ActionBar.Tab, FragmentTransaction) 方法必须重写或实现超类型方法 TabListener.java

TabListener 类型必须实现继承的抽象方法 ActionBar.TabListener.onTabReselected(ActionBar.Tab, FragmentTransaction) TabListener.java

TabListener 类型必须实现继承的抽象方法 ActionBar.TabListener.onTabSelected(ActionBar.Tab, FragmentTransaction) TabListener.java

TabListener 类型必须实现继承的抽象方法 ActionBar.TabListener.onTabUnselected(ActionBar.Tab, FragmentTransaction) TabListener.java

这是怎么回事?

您可能理解,我是 Java 和 Android 开发的新手。我觉得我很接近,但我无法解决这个问题。我不明白为什么它要“从 android.support.v4.app.Fragment 转换为 android.app.Fragment,而我什至没有在任何地方导入 android.app.Fragment。

我猜这与使用兼容性包有关。 (在为最新版本的 SDK 创建应用程序时,我是否必须使用这个包?)

【问题讨论】:

    标签: java android android-fragments android-viewpager android-4.0-ice-cream-sandwich


    【解决方案1】:

    尝试使用getSupportFragmentManager() 而不是getFragmentManager()

    【讨论】:

    • 我试试这个 TutViewerFragment 查看器 = (TutViewerFragment)getSupportFragmentManager().findFragmentById(R.id.tutview_fragment);但显示错误“无法从片段转换为 TutView 片段”
    • TutViewerFragment 的父级是什么?
    • 它从 FragmentActivity 扩展
    • @gayavat,为什么当我使用 getSupportFragmentManager(); Android Studio 显示未定义!
    【解决方案2】:

    这是怎么回事?

    虽然 Android 支持包为您提供了向后兼容的 Fragment 实现,但ActionBar 不是 Android 支持包的一部分。因此,ActionBar.TabListener 期待原生 API 级别 11 Fragment 对象。考虑使用 ActionBarSherlock 同时拥有操作栏和 Android 支持片段。

    但是我在 FragmentPagerAdapter 中遇到了另一个问题

    Android Support 包中的FragmentPagerAdapter 有点乱——它需要 API 级别 11 Fragment 对象,而不是 Android Support Fragment 对象。但是,您可以将源代码克隆到 FragmentPagerAdapter(源代码在您的 SDK 中)并创建自己的实现,使用 Fragment 和 kin 的 support.v4 风格。

    【讨论】:

    • 克隆 FragmentPagerAdapter,并要求它使用 android.app.Fragment/import android.app.FragmentManager/import android.app.FragmentTransaction 似乎有效.. 这次没有错误!谢谢
    • SLekvak,您的实现是否适用于 api 11 及更低版本的设备,还是仅适用于 api 13+?
    【解决方案3】:

    我知道现在回答这个问题为时已晚,但它可能会对遇到同样问题的人有所帮助。

    转到您的 java 文件夹并单击片段的活动。

    在导入中,将 import android.app.Fragment; 替换为

    import android.support.v4.app.Fragment;

    保持 MainActivity 中的代码完好无损,这应该有助于解决问题。

    注意:如果它不能立即起作用,请不要担心。 构建 > 重建项目

    【讨论】:

      【解决方案4】:

      这个解决方案适合我

      替换

      public class MyFragment extends Fragment{
      }
      

      public class MyFragment extends android.support.v4.app.Fragment{
      }
      

      同时替换导入

      import android.app.Fragment;
      

      import android.support.v4.app.Fragment;
      

      【讨论】:

        【解决方案5】:

        您可以删除支持包,这应该可以解决您的问题。仅当您在早期版本的应用中需要 Android 3.0 及更高版本的功能时才需要它。
        在您的情况下,您既从 ICS 获得默认片段,又从支持包中获得片段,如果您碰巧从不同的包中获取对象,它们将无法一起工作。

        短版;您可以使用 Honecomb 支持包之上的 api 级别,而不是两者。

        【讨论】:

        • 我明白了。我已经尝试消除使用支持包的需要,但是我的 FragmentPagerAdapter 中出现了另一个问题 - 我无法将其导入为“android.app.FragmentPagerAdapter”。 >返回类型与FragmentPagerAdapter.getItem(int)不兼容MainFragmentActivity.java这里尝试返回fragment,即Fragment mFragment = LatestFragment.newInstance(position);
        • 拥有 API 级别 11 或更高级别的构建目标使用 Android 支持包是完全合理的。
        • @CommonsWare:我的印象是支持包 (v4) 是基于 API 级别 11 的功能构建的(v13 包让我忘记了),但在 op 的情况下,当他为 ICS 开发时(API>13),包的内容应该是支持的,不需要额外的包,还是我错了?
        • @Jave:好吧,我不能完全按照 OP 写的所有内容。 :-) 如果您只是部署到 API 级别 11 及更高级别,您可以使用 API 级别 11 提供的本机 Fragment 实现。如果您要部署到旧设备,则需要使用Android 支持包,无论您的构建目标如何。完全有可能希望 ICS 构建目标用于可以在旧设备上绕过的选择性事物(例如,CalendarContract),但仍希望将 Android 支持包用于需要完全向后兼容的基本内容。跨度>
        • @CommonsWare:那我和你在一起,我的假设是 OP 的目标和部署在 API 级别 >13。
        【解决方案6】:

        我昨天也遇到了同样的问题。

        有一个非常好的page by Samsung 涵盖了 ActionBarSherlock。 检查您是否使用左侧的导入/类/方法之一,并将它们替换为右侧的导入/类/方法。

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题。通过将接口从implements ActionBar.TabListener更改为implements TabListener,然后实现该接口内部的方法来解决它。它还提到了您提到的错误。

          【讨论】:

            【解决方案8】:

            看这里:fragmentTransaction.add(R.id.main_container, new HomeFragment()); 您添加片段,但遵循,您使用replace() 方法,因此您应该使用替换而不是add()

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-03-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多