无法将android.support.v4.app.Fragment转换为android.app.Fragment。

45

我正在做我的第一个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创建应用程序时,我是否必须使用此包?)
8个回答

130

尝试使用getSupportFragmentManager()代替getFragmentManager()


我尝试这个代码:TutViewerFragment viewer = (TutViewerFragment)getSupportFragmentManager().findFragmentById(R.id.tutview_fragment); 但是出现了错误:“无法将Fragment转换为TutView Fragment”。 - Newts
TutViewerFragment的父类是什么? - gayavat
它继承自FragmentActivity。 - Newts
@gayavat,为什么我使用 getSupportFragmentManager();时,Android Studio会显示未定义! - Mazen Kasser
也许这会有帮助:https://dev59.com/uOo6XIcBkEYKwwoYOR4q - gayavat
@ gayavat 你好。我遇到了同样的问题。但是我需要在Fragment中实现ViewPager,而不是Activity。我该怎么办? - user2875895

14

这里发生了什么?

虽然 Android 支持包提供了向后兼容的 Fragment 实现,但是 ActionBar 不是 Android 支持包的一部分。因此,ActionBar.TabListener 需要本机 API Level 11 的 Fragment 对象。考虑使用 ActionBarSherlock 来同时拥有操作栏和 Android 支持片段。

但是在我的 FragmentPagerAdapter 中还有另一个问题

Android 支持包中的 FragmentPagerAdapter 有点混乱,它需要 API Level 11 的 Fragment 对象,而不是 Android 支持的 Fragment 对象。但是,您可以克隆 FragmentPagerAdapter 的源代码(源代码位于 SDK 中),并创建自己的实现来使用 support.v4 版本的 Fragment 和相关组件。


克隆FragmentPagerAdapter,并要求它使用android.app.Fragment / import android.app.FragmentManager / import android.app.FragmentTransaction似乎已经奏效了。这次没有错误!谢谢 - Kjell-Bear
SLekvak,你的实现在API 11及以下设备上工作吗,还是只在API 13+上工作? - MattF

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;

4

我知道回答这个问题已经太晚了,但它可能有助于遇到同样问题的人。

前往您的 java 文件夹并单击您的片段活动。

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

import android.support.v4.app.Fragment;

保持 MainActivity 中的代码不变,这应该有助于解决问题。

注意:如果一次不能解决问题,请不要担心。Build > Rebuild project


0

看这里:fragmentTransaction.add(R.id.main_container, new HomeFragment()); 你添加了片段,但是接下来你使用了replace()方法,所以你应该使用replace()而不是add()


0

我曾经遇到过同样的问题。通过将接口从implements ActionBar.TabListener更改为implements TabListener,然后在此接口内实现方法来解决它。这也提到了你所提到的错误。


0

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

三星有一个非常好的页面,介绍了ActionBarSherlock。 请检查您是否使用了左侧的导入/类/方法之一,并将其替换为右侧的导入/类/方法。


0

您可以删除支持包,这应该可以解决您的问题。只有在您需要在早期版本的应用程序中使用Android 3.0及以上版本的功能时才需要它。
在您的情况下,您同时获得了来自ICS的默认片段和来自支持包的片段,如果您恰好从不同的包中获取对象,则它们将无法一起工作。

简短版; 您只能使用高于Honecomb的api级别支持包,而不能同时使用两者。


我明白了。我已经尝试过去掉使用支持包的需要,但是接下来在我的FragmentPagerAdapter中又出现了另一个问题——我无法将其导入为“android.app.FragmentPagerAdapter”。返回类型与FragmentPagerAdapter.getItem(int)不兼容 MainFragmentActivity.java它在这里尝试返回fragment,即Fragment mFragment = LatestFragment.newInstance(position); - Kjell-Bear
1
拥有API Level 11或更高版本的构建目标并使用Android Support包是完全合理的。 - CommonsWare
@CommonsWare:我的理解是支持包(v4)是基于API 11的功能构建的(我忘了v13包),但在OP的情况下,当他开发ICS(API>13)时,包的内容应该可以在没有额外包的情况下得到支持,或者我错了吗? - Jave
@Jave:嗯,我无法完全理解楼主的写作内容。如果您只是部署到API 11及以上版本,则可以使用API 11提供的本地“Fragment”实现。 如果您要部署到旧设备上,则需要使用Android支持包,而不管您的构建目标如何。 完全有可能希望为某些选择性功能(例如“CalendarContract”)设置ICS构建目标,可以在旧设备上绕过该功能,但仍然希望使用Android支持包来处理需要完全向后兼容的基本功能。 - CommonsWare
@CommonsWare: 那我同意你的说法,我的假设是 OP 正在针对 API 级别 >13 进行部署。 - Jave
我有点不清楚,主要是因为我还不熟悉这个领域,语言也不好。我的目标是大于13岁。 - Kjell-Bear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接