我正在制作我的第一款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创建应用程序时,我是否必须使用此软件包?)
答案 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.v4
类Fragment
和亲属的风格。
答案 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;
}