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

时间:2012-01-24 20:07:12

标签: 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  
    }
}

通过删除“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 个答案:

答案 0 :(得分:126)

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

答案 1 :(得分: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.v4Fragment和亲属的风格。

答案 2 :(得分:4)

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

转到 java 文件夹,然后点击片段的活动。

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

import android.support.v4.app.Fragment;

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

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

答案 3 :(得分:4)

  

此解决方案适合我

替换

public class MyFragment extends Fragment{
}

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

并替换import

import android.app.Fragment;

import android.support.v4.app.Fragment;

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

看这里:replace() 您添加了片段,但是请按照add()方法使用,因此您应该使用替换而不是//RadioCountToLedC.nc #include "Timer.h" #include "RadioCountToLeds.h" module RadioCountToLedsC @safe() { uses { interface Leds; interface Boot; interface Receive; interface Packet; } } implementation { message_t packet; uint16_t counter = 0; event void Boot.booted() { } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { call Leds.led0On(); dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len); if (len != sizeof(radio_count_msg_t)) {return bufPtr;} else { radio_count_msg_t* rcm = (radio_count_msg_t*)payload; if (rcm->counter%3 == 0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (rcm->counter%3 == 1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (rcm->counter%3 == 2) { call Leds.led2On(); } else { call Leds.led2Off(); } return bufPtr; } } } //RadioToLedAppC.nc #include "RadioCountToLeds.h" configuration RadioCountToLedsAppC {} implementation { components MainC, RadioCountToLedsC as App, LedsC; components new AMReceiverC(AM_RADIO_COUNT_MSG); components new TimerMilliC(); components ActiveMessageC; }