无法从android.support.v4.app.Fragment转换为android.app.Fragment

SLe*_*vak 45 java android android-fragments android-viewpager android-4.0-ice-cream-sandwich

我正在做我的第一个Android应用程序,并希望直接进入ICS API.到目前为止,我已经使用ActionBar创建了一个应用程序,使用Viewpager和Fragments可以使用可滑动的选项卡.

然而,我确实经历了一些我一直在回归的错误.

根据我如何实现它,它总是回到"类型不匹配"错误:"无法从android.support.v4.app.Fragment转换为android.app.Fragment".我已经尝试删除所有导入引用,当我在TabListener,FragmentActivity和我的两个片段中仅使用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  
    }
}
Run Code Online (Sandbox Code Playgroud)

通过删除"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创建应用程序时,我是否必须使用此软件包?)

gay*_*vat 128

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


Com*_*are 14

这里发生了什么?

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

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

FragmentPagerAdapter在Android支持包是有点乱-它希望API等级11 Fragment的对象,而不是Android的支持Fragment对象.但是,您可以将源克隆到FragmentPagerAdapter(源代码在SDK中)并创建自己的实现,该实现使用了kin 的support.v4味道Fragment.


Jav*_*ave 0

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

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