【问题标题】:Android - Error inflating class fragmentAndroid - 膨胀类片段时出错
【发布时间】:2013-06-30 18:14:48
【问题描述】:

我有一个管理片段列表的活动。我添加的一个新片段是扩展 ListFragmet 而不是 Fragment,我将它作为其他片段添加到活动 xml 布局文件中。我在声明 ListFragment 的行的这个文件中得到了一个 InflatingException。这个声明有什么问题?

活动 XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment android:name="com.example.foodexp01b.HomeFragment"
          android:id="@+id/homeFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />
    <fragment android:name="com.example.foodexp01b.LoginFragment"
          android:id="@+id/loginFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />
    <fragment android:name="com.example.foodexp01b.SettingsFragment"
          android:id="@+id/settingsFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

    <fragment android:name="com.example.foodexp01b.DestinationFragment"
          android:id="@+id/destinationFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />
    <fragment
          android:id="@+id/mapFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:name="com.google.android.gms.maps.SupportMapFragment"/>

    <fragment android:name="com.example.foodexp01b.RestaurantFragment"
          android:id="@+id/restaurantFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

    <fragment android:name="com.example.foodexp01b.FavoritesFragment"
          android:id="@+id/favoritesFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

</LinearLayout>

Activity OnCreate 代码

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        uiHelper = new UiLifecycleHelper(this, callback);
        uiHelper.onCreate(savedInstanceState);

        FragmentManager fm = getSupportFragmentManager();
        fragments[LOGIN] = fm.findFragmentById(R.id.loginFragment);
        fragments[HOME] = fm.findFragmentById(R.id.homeFragment);
        fragments[SETTINGS] = fm.findFragmentById(R.id.settingsFragment);
        fragments[SETTINGS].getView().findViewById(R.id.back_button1)
        .setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                currentFragment = HOME;
                showFragment(HOME, false);
            }
        });
        fragments[DESTINATIONS] = fm.findFragmentById(R.id.destinationFragment);
        fragments[DESTINATIONS].getView().findViewById(R.id.back_button2)
        .setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                currentFragment = HOME;
                showFragment(HOME, false);
            }
        });
        fragments[MAP] = fm.findFragmentById(R.id.mapFragment);
        fragments[RESTAURANT] = fm.findFragmentById(R.id.restaurantFragment);
        fragments[RESTAURANT].getView().findViewById(R.id.restaurant_back_button)
        .setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                currentFragment = MAP;
                showFragment(MAP, false);
            }
        });
        fragments[FAVORITES].getView().findViewById(R.id.favoritesFragment);
        FragmentTransaction transaction = fm.beginTransaction();
        for(int i = 0; i < fragments.length; i++) {
            transaction.hide(fragments[i]);
        }
        transaction.commit();
    }

FavoritesFragment OnCreate查看代码

@Override
    public View onCreateView(LayoutInflater inflater, 
            ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(android.R.layout.simple_list_item_1, container, false);
        favorites = new ArrayList<String>();
        setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, favorites));

        getListView().setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                }
            });
        return view;
    }

日志

06-30 20:17:53.609: E/AndroidRuntime(675): FATAL EXCEPTION: main
06-30 20:17:53.609: E/AndroidRuntime(675): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.foodexp01b/com.example.foodexp01b.MainActivity}: android.view.InflateException: Binary XML file line #36: Error inflating class fragment
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2063)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.ActivityThread.access$600(ActivityThread.java:134)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.os.Looper.loop(Looper.java:137)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.ActivityThread.main(ActivityThread.java:4744)
06-30 20:17:53.609: E/AndroidRuntime(675):  at java.lang.reflect.Method.invokeNative(Native Method)
06-30 20:17:53.609: E/AndroidRuntime(675):  at java.lang.reflect.Method.invoke(Method.java:511)
06-30 20:17:53.609: E/AndroidRuntime(675):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
06-30 20:17:53.609: E/AndroidRuntime(675):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-30 20:17:53.609: E/AndroidRuntime(675):  at dalvik.system.NativeStart.main(Native Method)
06-30 20:17:53.609: E/AndroidRuntime(675): Caused by: android.view.InflateException: Binary XML file line #36: Error inflating class fragment
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
06-30 20:17:53.609: E/AndroidRuntime(675):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:262)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.Activity.setContentView(Activity.java:1867)
06-30 20:17:53.609: E/AndroidRuntime(675):  at com.example.foodexp01b.MainActivity.onCreate(MainActivity.java:118)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.Activity.performCreate(Activity.java:5008)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027)
06-30 20:17:53.609: E/AndroidRuntime(675):  ... 11 more
06-30 20:17:53.609: E/AndroidRuntime(675): Caused by: java.lang.IllegalStateException: Content view not yet created
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
06-30 20:17:53.609: E/AndroidRuntime(675):  at com.example.foodexp01b.FavoritesFragment.onCreateView(FavoritesFragment.java:63)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:280)
06-30 20:17:53.609: E/AndroidRuntime(675):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
06-30 20:17:53.609: E/AndroidRuntime(675):  ... 21 more

【问题讨论】:

  • 使用 LogCat 检查与您的异常关联的 Java 堆栈跟踪。如果您无法解释堆栈跟踪告诉您的内容,请编辑您的问题并发布堆栈跟踪(例如,使用 Ctrl-C 将突出显示的行从 DDMS 的 LogCat 视图复制到剪贴板)。
  • 是的,抱歉,忘记发布日志

标签: android fragment android-listfragment inflate-exception


【解决方案1】:

您在onCreateView() 中呼叫getListView()。问题是 ListView 是在 in onCreateView() 中创建的,所以在您从 onCreateView() 返回之前,超类还没有 ListView

我建议您将onCreateView() 代码移动到onActivityCreated(),届时ListView 将被创建。此外,您可以摆脱那个 view 局部变量,因为您没有使用它。而且,如果FavoritesFragmentListFragment,则不要调用setOnItemClickListener(),而是在片段中覆盖onListItemClick()

【讨论】:

  • 谢谢,我已将代码移至 onActivityCreated()。但是 eclipse 告诉我“对于 ListView 类型的方法 setOnListItemClick(new OnListItemClick(){}) 未定义”,代码为 getListView().setOnListItemClick
  • @user2265222:ListView 上没有 setOnListItemClick() 方法。我建议覆盖 onListItemClick() 在你的片段上,如果那个片段是ListFragment: developer.android.com/reference/android/app/…, android.view.View, int, long)
  • 知道了,但是在主要活动中,我必须管理要显示的片段和要隐藏的片段,并且(可以根据您的解释)我在拿起片段时遇到空异常活动创建。我应该从 ListFragment 调用回调到 Activity 以在正确的时间设置它吗?
  • @user2265222:很抱歉,我不明白您的问题的性质。您可能会考虑打开一个新的 StackOverflow 问题,其中包含更新的代码和新的堆栈跟踪,以扩展说明您正在尝试什么以及问题发生在哪里。
猜你喜欢
  • 2015-04-15
  • 2016-09-14
  • 1970-01-01
  • 2011-09-19
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多