错误充气类片段|片段没有创建一个视图 [英] Error inflating class fragment | fragment did not create a view

查看:129
本文介绍了错误充气类片段|片段没有创建一个视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的问题:

android.view.InflateException:二进制XML文件行#31:错误充气类片段
片段com.myapp.mgm.QueryFragment没有创建一个视图。

此问题只在平板电脑模式时发生。如果应用程序在手机上运行,​​它工作正常。

This problem is only happening when in tablet mode. If app runs on phone, it works ok.

我有这样的布局大 XML文件(fragments.xml):

I have this layout-large xml file (fragments.xml):

<android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/lightgrey">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@color/lightgrey"
              android:baselineAligned="false">

    <fragment
            android:name="com.myapp.mgm.QueryFragment"
            android:id="@+id/fragment1"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            tools:layout="@layout/nu"/>

    <fragment
            android:name="com.myapp.mgm.Infodata"
            android:id="@+id/fragment2"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            tools:layout="@layout/maindata"/>

</LinearLayout>
        <ListView
                android:id="@+id/list_slidermenu"
                android:layout_width="240dp"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:choiceMode="singleChoice"
                android:divider="@color/orange"
                android:dividerHeight="1dp"
                android:listSelector="@drawable/menulist_selector"
                android:background="@color/lblack"/>
</android.support.v4.widget.DrawerLayout>

正如你可以看到我有两个片段,并在我的布局,一个导航的抽屉里。

As you can see I have two fragments and one Navigation drawer on my layout.

这是把所有这一切共同的类是这样的:

The class that puts all of this together is this:

public class Fragments extends ActionBarActivity implements QueryFragment.OnQuerySelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragments);

        slidingMenu();

        if (findViewById(R.id.fragmentsboth) != null) {
            if (savedInstanceState != null) {
                return;
            }
            QueryFragment firstFragment = new QueryFragment();
            getSupportFragmentManager().beginTransaction().add(R.id.fragmentsboth, firstFragment).commit();
        }
    }
}

和我的 QueryFragment 类是这样的:

public class QueryFragment extends ListFragment {
    public interface OnQuerySelectedListener {
        public void onItemSelected(Bundle itemSelectedData);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        operation = Fragments.operation;
        if (operation == 0) {
            layoutToShow = inflater.inflate(R.layout.querylist, container, false);
            ...
        } else if (operation == 1) {
            layoutToShow = inflater.inflate(R.layout.querylist, container, false);
            ...
        } else if (operation == 2) {
            layoutToShow = inflater.inflate(R.layout.search, container, false);
            ...
        } else if (operation == 3) {
            layoutToShow = inflater.inflate(R.layout.nu, container, false);
            ...
        }
        return layoutToShow;
    }

}

和我的 INFODATA 类这些东西:

public class Infodata extends Fragment implements OnSeekBarChangeListener, OnItemSelectedListener {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setHasOptionsMenu(true);

        View itemDataLayout = inflater.inflate(R.layout.maindata, container, false);
        ....

        if (savedInstanceState != null && savedInstanceState.size()>=2) {
            layoutType = savedInstanceState.getInt("layout");
            comesFromSavedState = true;
            itemData = savedInstanceState;
        }
        return itemDataLayout;
    }

    @Override
    public void onStart() {
        super.onStart();

        Bundle args = getArguments();
        if (args != null) {
            populateLayoutWithData(1, args);
        } else if(comesFromSavedState){
            populateLayoutWithData(2, itemData);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //Saves stuff (data) in a bundle to restore after screen rotation
    }   
}

基本上我有一个列表视图左侧片段( QueryFragment ),并选择其中一个项目后用户(有数据光标),右片段( INFODATA )填充了此光标的提取数据。
如果我选择从左侧片段的intem和它的数据其填充在右边的片段,因为我节省了的onSaveInstanceState 数据,如果我旋转屏幕,一切工作OK,就是装载数据的右边片段。

Basically I have a listview on the left fragment (QueryFragment) and after the user selects one of the items (a cursor with data), the right fragment (InfoData) is populated with the extracted data of this cursor. If I select an intem from the left fragment and it's data its populated on the right fragment, since i'm saving data on onSaveInstanceState, if I rotate the screen, everything is working OK, that is, data is reloaded on the right fragment.

现在,我Navigadion抽屉为4个选项。此每一个选项,加载的ListView 在左边的片段,然后,如前所述,如果用户选择这些项目中的一个,它的数据被装载在右侧片段

Now, my Navigadion Drawer as 4 options. Each one of this options, loads a listView on the left fragment, and then, as before, if the user selects one of those items, it's data is loaded on the right fragment.

下面是code处理这个在我的片段类:

Here is the code that handles this in my Fragments class:

private void selectItem(int position) {
    int typeOfLayout;
    mDrawerList.setItemChecked(position, true);
    mDrawerLayout.closeDrawer(mDrawerList);
    QueryFragment newFragment;
    FragmentTransaction transaction;

    ViewGroup parentView = (ViewGroup) findViewById(R.id.fragmentsboth);

    if (parentView != null) {
        typeOfLayout = R.id.fragmentsboth;
    } else {
        typeOfLayout = R.id.fragment1;
    }

    switch (position) {
        case 0:
            Intent i = new Intent(this, NutriData.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
            finish();
            break;
        case 1:
            newFragment = new QueryFragment();
            operation = 0;
            transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(typeOfLayout, newFragment).commit();
            break;
        case 2:
            newFragment = new QueryFragment();
            operation = 1;
            transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(typeOfLayout, newFragment).commit();
            break;
        case 3:
            newFragment = new QueryFragment();
            operation = 2;
            transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(typeOfLayout, newFragment).commit();
            break;
        case 4:
            newFragment = new QueryFragment();
            operation = 3;
            transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(typeOfLayout, newFragment).commit();
            break;
    }
}

想象一下塞纳里奥:

Imagine this senario:

我得到了一个的ListView 与项目的左侧片断,然后选择其中一个项目。然后,它的数据传递给穿上的是在正确的地方正确的片段。如果我旋转屏幕,数据被保存并旋转后重新装入右侧的片段。现在,我打开抽屉式导航栏,并选择其中的一个选项(1,2,3或4),它对应的的ListView 加载左侧片段。右片段保持表示作为选自第一个项目的用户的数据。现在,I $上的左片段的新物品P $ PSS和它的数据被装载在右侧片段。甜。它的工作,我想。问题是如果我现在我的旋转屏幕。我得到这个错误:

I got a listViewwith item's on the left fragment and then select one of these items. Then, it's data is passed to the right fragment that put's it on the right place. If I rotate the screen, data is saved and after rotation is reloaded on the right fragment. Now, I open the navigation drawer and select one of the options (1,2,3 or 4) and it's corresponding listView is loaded on the left fragment. The right fragment keeps showing the data from the first item the user as selected. Now, I press on a new item on the left fragment and it's data is loaded on the right fragment. Sweet. It's working as I wanted to. The problem is if I now rotate my screen. I'm getting this error:

01-01 15:51:16.356    2569-2569/com.myapp.mgm E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.mgm/com.myapp.mgm.Fragments}: android.view.InflateException: Binary XML file line #31: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3740)
            at android.app.ActivityThread.access$700(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #31: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:267)
            at android.app.Activity.setContentView(Activity.java:1895)
            at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
            at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)
            at com.myapp.mgm.Fragments.onCreate(Fragments.java:27)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3740)
            at android.app.ActivityThread.access$700(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalStateException: Fragment com.myapp.mgm.QueryFragment did not create a view.
            at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:308)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:267)
            at android.app.Activity.setContentView(Activity.java:1895)
            at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
            at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)
            at com.myapp.mgm.Fragments.onCreate(Fragments.java:27)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3740)
            at android.app.ActivityThread.access$700(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

有人可以解释我什么,我做错了吗?

Can someone please explain me what I'm doing wrong?

推荐答案

尝试删除

xmlns:android="http://schemas.android.com/apk/res/android

的LinearLayout

这篇关于错误充气类片段|片段没有创建一个视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆