错误充气类片段|片段没有创建一个视图 [英] Error inflating class fragment | fragment did not create a view
问题描述
我有这样的问题:
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 listView
with 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屋!