无法将其转换为android.app.Fragment

31

我只是想研究一下Fragment,但遇到了一些愚蠢的问题......这是我的SkippersActivity.java代码:

public class SkippersActivity extends Activity{
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    setContentView(R.layout.skippers_fragment);
 }
}

这是我的 skippers_fragment.xml 文件:

 <?xml version="1.0" encoding="utf-8"?>
    <fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.arkezis.globedroid.SkippersFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/skippers_fragment">
    </fragment>

这是我的 SkippersFragment.xml 文件:

public class SkippersFragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    View mainView = inflater.inflate(R.layout.skippers, container, false);      
    return mainView;
}   

我的 skippers.xml 文件:

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >    
    <ListView android:id="@+id/list_skippers_all"
        android:layout_width="match_parent"
    android:layout_height="match_parent">
    </ListView>
    </LinearLayout>

我为什么会得到:

04-30 13:45:16.355: E/AndroidRuntime(30077): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arkezis.globedroid/com.arkezis.globedroid.SkippersActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.os.Looper.loop(Looper.java:137)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.ActivityThread.main(ActivityThread.java:4424)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at java.lang.reflect.Method.invokeNative(Native Method)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at java.lang.reflect.Method.invoke(Method.java:511)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at dalvik.system.NativeStart.main(Native Method)
04-30 13:45:16.355: E/AndroidRuntime(30077): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.Activity.setContentView(Activity.java:1835)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at com.arkezis.globedroid.SkippersActivity.onCreate(SkippersActivity.java:19)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.Activity.performCreate(Activity.java:4465)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
04-30 13:45:16.355: E/AndroidRuntime(30077):    ... 11 more
04-30 13:45:16.355: E/AndroidRuntime(30077): Caused by: java.lang.ClassCastException: com.arkezis.globedroid.SkippersFragment cannot be cast to android.app.Fragment
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.Fragment.instantiate(Fragment.java:574)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.Fragment.instantiate(Fragment.java:549)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.app.Activity.onCreateView(Activity.java:4235)
04-30 13:45:16.355: E/AndroidRuntime(30077):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673)

请问您能否粘贴SkippersFragment.java的导入语句? - Rajesh
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; - Arkezis
请查看 https://dev59.com/0m035IYBdhLWcg3weP3f#5404643 和 https://dev59.com/IlXTa4cB1Zd3GeqP48rB#5584218。 - Rajesh
给你的类取一个太相似的名字是不好的,这会让人感到困惑。 - akemalFirdaus
4个回答

101
如果我要猜的话,SkippersFragment 应该是扩展了 android.support.v4.app.Fragment。然而,SkippersActivity 并没有扩展 android.support.v4.app.FragmentActivity。所以,SkippersActivity 正试图使用原生 API 级别 11 的片段。

1
@TacB0sS:有才华的程序员通过使用Android支持包来增强向后兼容性。 - CommonsWare
2
@TacB0sS:因此,片段回溯并不会“抛弃向后兼容性”。糟糕编写的“第三方基础设施”才会“抛弃向后兼容性”。 - CommonsWare
8
未来前来此处的人应注意,在使用支持包时,需要使用getSupportFragmentManager()而不是getFragmentManager(),否则您也将遇到相同的问题。 - MrTristan
好提示,我想开发者指南里没有这样的线索。真是太糟糕了!:-( - sai
1
@CommonsWare,您真是个天才!我也做了同样的事情,一直在破解代码,您救了我的一天。 - Illegal Argument
显示剩余3条评论

19
如果您使用v4兼容包,则Activity必须扩展FragmentActivity,而不是Activity。如果您使用Android > 3.0,则Activity扩展Activity,但请阅读CommonsWare的答案,了解不要混合使用这两种类型的片段。

2

另一个需要注意的陷阱是确保您从活动中调用super.onCreate()。如果像我一样犯了这个愚蠢的错误,即使您没有将标准和support.v4版本的类匹配不上,您也会看到“错误膨胀类片段”和“...无法转换为android.app.Fragment”的错误。


不仅如此,如果你的片段在xml布局中,你必须在调用setContentView之前调用它,而你的答案帮助我发现了这一点。 - Andrew Kirkegaard

0
我在尝试扩展ListFragment时遇到了相同的错误。我的发现是,在一个最小SDK版本小于11的项目中使用ListFragment,我必须导入android.support.v4.app.ListFragment;。否则,我必须导入android.app.ListFragment;
这个链接澄清了我的问题。

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