【问题标题】:Cannot be cast to android.app.Fragment无法转换为 android.app.Fragment
【发布时间】:2012-04-30 11:51:28
【问题描述】:

我只是想看看 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 的导入语句?
  • 导入android.os.Bundle;导入android.support.v4.app.Fragment;导入 android.view.LayoutInflater;导入android.view.View;导入 android.view.ViewGroup;
  • 用如此相似的名字来命名你的类是不好的。可能会令人困惑。

标签: android


【解决方案1】:

如果我不得不猜测,SkippersFragment 正在扩展android.support.v4.app.Fragment。但是,SkippersActivity不是扩展android.support.v4.app.FragmentActivity。所以SkippersActivity 正在尝试使用本机 API 级别 11 片段。

【讨论】:

  • 你是 100% 正确的......但是,他们应该只是强制片段在扩展 jar 中使用......这是一个非常愚蠢的要求,这会使向后兼容性付诸东流.. .
  • @TacB0sS:有才华的程序员通过使用 Android 支持包增加向后兼容性。
  • @TacB0sS:因此,fragments backport 不会“抛弃向后兼容性”。写得不好的“第 3 方基础设施”可能会“使向后兼容性付诸东流”。
  • 以后来这里的人请注意,在使用支持包时需要使用 getSupportFragmentManager() 而不是 getFragmentManager() 否则也会遇到同样的问题。
  • @CommonsWare 你真是个天才
【解决方案2】:

如果您使用 v4 兼容包,您的 Activity 必须扩展 FragmentActivity,而不是 Activity。如果您使用 Android > 3.0,那么您的 Activity 会扩展 Activity,但请阅读 CommonsWare 关于不混合两种类型的片段的答案。

【讨论】:

    【解决方案3】:

    另一个需要注意的陷阱是确保不要忘记从活动中调用 super.onCreate()。如果你像我一样犯了这个愚蠢的错误,即使你没有不匹配标准和支持,你也会看到“Error inflating class fragment”和“... cannot be cast to android.app.Fragment”错误.v4 版本的类。

    【讨论】:

    • 不仅如此,如果您的片段在 xml 布局中,您必须在调用setContentView 之前调用它之前,您的回答帮助我发现了这一点。
    【解决方案4】:

    我在尝试扩展 ListFragment 时遇到了同样的错误。我的发现是,要在 minSdkVersion import android.support.v4.app.ListFragment;。否则,我将不得不import android.app.ListFragment;

    link 澄清了我的问题。

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      相关资源
      最近更新 更多