首页 文章

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

提问于
浏览
42

我正在做我的第一个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  
    }
}

通过删除“android.app.FragmentTransaction ft”,将其替换为“FragmentTransaction ft”,问题变得非常糟糕 . 然后出现新问题:

TabListener类型的onTabReselected(ActionBar.Tab,FragmentTransaction)方法必须覆盖或实现超类型方法TabListener.java TabListener类型的onTabSelected方法(ActionBar.Tab,FragmentTransaction)必须覆盖或实现超类型方法TabListener.java方法onTabUnselected TabListener类型的(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 回答

  • 0

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

  • 14

    这是怎么回事?

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

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

    Android支持包中的 FragmentPagerAdapter 有点乱 - 它需要API Level 11 Fragment 对象,而不是Android Support Fragment 对象 . 但是,您可以将源克隆到 FragmentPagerAdapter (源代码在SDK中)并创建自己的实现,该实现使用 support.v4 _和亲属的 support.v4 风格 .

  • 122

    我知道回答这个问题为时已晚,但它可能会帮助有同样问题的人 .

    转到java文件夹,然后单击片段的活动 .

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

    import android.support.v4.app.Fragment;

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

    注意:如果它没有't work at once, don'吨担心 . 构建>重建项目 .

  • 0

    此解决方案适合我

    更换

    public class MyFragment extends Fragment{
    }
    

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

    并取代进口

    import android.app.Fragment;
    

    import android.support.v4.app.Fragment;
    
  • 0

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

    精简版;你可以使用支持包以上的api级别,而不是两者 .

  • 4

    我昨天遇到了同样的问题 .

    有一个很好的page by Samsung涵盖了ActionBarSherlock . 检查是否使用左侧的某个导入/类/方法,并用右侧的imports / classes / methods替换它们 .

  • 4

    我有同样的问题 . 通过将接口从 implements ActionBar.TabListener 更改为 implements TabListener 来解决此问题,然后在此接口中实现方法 . 它还提到了你提到的错误 .

  • 0

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

相关问题