我試圖做一個包含3個選項卡的ActionBar的應用程序:「地圖」,「Destinatiosn」和「關於我們」。基本上我使用ViewPager作爲主要佈局,並使用Fragments作爲單獨的尋呼機視圖。android.view.InflateException:二進制XML文件行:錯誤膨脹類片段
activity_main.xml中
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager>
MainActivity.java
public class MainActivity extends FragmentActivity implements ActionBar.TabListener { private ViewPager viewPager; private TabsPagerAdapter mAdapter; private ActionBar actionBar; // Tab titles private String[] tabs = { "Maps", "Destinations", "About us" }; /*************************************************************************************** * */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialization //tabs = getResources().getStringArray(R.array.tabs_titles); viewPager = (ViewPager) findViewById(R.id.pager); actionBar = getActionBar(); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); //actionBar.setHomeButtonEnabled(false); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Adding Tabs for (String tab_name : tabs) { actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this)); } /** * on swiping the viewpager make respective tab selected * */ viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBar.setSelectedNavigationItem(position); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } /*************************************************************************************** * */ @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } /*************************************************************************************** * */ @Override public void onTabReselected(Tab tab, android.app.FragmentTransaction arg1) { } /*************************************************************************************** * */ @Override public void onTabSelected(Tab tab, android.app.FragmentTransaction arg1) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } /*************************************************************************************** * */ @Override public void onTabUnselected(Tab tab, android.app.FragmentTransaction arg1) { // TODO Auto-generated method stub }
}
我創建一個FragmentPagerAdapter類,以提供意見標籤片段。
public class TabsPagerAdapter extends FragmentPagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
// Map fragment activity
return new MapFragment();
case 1:
// Destinations fragment activity
return new DestinationsFragment();
case 2:
// About Us fragment activity
return new AboutUsFragment();
}
return null;
}
@Override
public int getCount() {
// get item count - equal to number of tabs
return 3;
}
}
項目的每一個與他的活動課的佈局文件。
地圖
fragment_map佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
MapFragment類
public class MapFragment extends Fragment { GoogleMap mapa; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { try{ if(mapa == null){ mapa = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap(); } View rootView = inflater.inflate(R.layout.fragment_map, container, false); return rootView; }catch(Exception e){ View rootView = inflater.inflate(R.layout.fragment_map, container, false); e.printStackTrace(); return rootView; }
}}
個
目的地(只是現在文本視圖相對佈局)
佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ff8400" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Destinations Screen"
android:textSize="20sp"
android:layout_centerInParent="true"/>
</RelativeLayout>
類
public class DestinationsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d("", "CESAR");
View rootView = inflater.inflate(R.layout.fragment_destinations, container, false);
return rootView;
}
}
- 關於我們(只是帶文字的相對佈局鑑於現在)
佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#17df0d">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Diseñar la pantalla de About Us"
android:textSize="20sp"
android:layout_centerInParent="true"/>
</RelativeLayout>
類
public class AboutUsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_about_us, container, false);
return rootView;
}
}
的問題是,當我從標籤「關於我們」更改爲任何其他選項卡,應用程序停止工作和崩潰。但是,當我從「目的地」選項卡更改爲「地圖」選項卡並向後改變時,不會發生這種情況。當我添加MapFragment時出現了這個錯誤,在此之前,地圖佈局只是一個帶有文本視圖的RelativeLayout,並且運行良好。地圖起作用。
Excption堆棧跟蹤
04-10 00:35:23.070: W/System.err(16428): android.view.InflateException: Binary XML file line #7: Error inflating class fragment 04-10 00:35:23.070: W/System.err(16428): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java) 04-10 00:35:23.070: W/System.err(16428): at android.view.LayoutInflater.rInflate(LayoutInflater.java) 04-10 00:35:23.070: W/System.err(16428): at android.view.LayoutInflater.inflate(LayoutInflater.java) 04-10 00:35:23.075: W/System.err(16428): at android.view.LayoutInflater.inflate(LayoutInflater.java) 04-10 00:35:23.075: W/System.err(16428): at com.bikes.touristtest.MapaFragment.onCreateView(MapaFragment.java:22) 04-10 00:35:23.075: W/System.err(16428): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500) 04-10 00:35:23.075: W/System.err(16428): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938) 04-10 00:35:23.075: W/System.err(16428): at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1291) 04-10 00:35:23.080: W/System.err(16428): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672) 04-10 00:35:23.080: W/System.err(16428): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478) 04-10 00:35:23.080: W/System.err(16428): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478) 04-10 00:35:23.080: W/System.err(16428): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 04-10 00:35:23.080: W/System.err(16428): at android.support.v4.view.ViewPager.populate(ViewPager.java:1068) 04-10 00:35:23.085: W/System.err(16428): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:550) 04-10 00:35:23.085: W/System.err(16428): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:509) 04-10 00:35:23.085: W/System.err(16428): at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:490) 04-10 00:35:23.085: W/System.err(16428): at com.bikes.touristtest.MainActivity.onTabSelected(MainActivity.java:92) 04-10 00:35:23.090: W/System.err(16428): at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java) 04-10 00:35:23.090: W/System.err(16428): at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java) 04-10 00:35:23.090: W/System.err(16428): at com.android.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java) 04-10 00:35:23.090: W/System.err(16428): at android.view.View.performClick(View.java) 04-10 00:35:23.090: W/System.err(16428): at android.view.View$PerformClick.run(View.java) 04-10 00:35:23.090: W/System.err(16428): at android.os.Handler.handleCallback(Handler.java) 04-10 00:35:23.095: W/System.err(16428): at android.os.Handler.dispatchMessage(Handler.java) 04-10 00:35:23.095: W/System.err(16428): at android.os.Looper.loop(Looper.java) 04-10 00:35:23.095: W/System.err(16428): at android.app.ActivityThread.main(ActivityThread.java) 04-10 00:35:23.095: W/System.err(16428): at java.lang.reflect.Method.invokeNative(Native Method) 04-10 00:35:23.095: W/System.err(16428): at java.lang.reflect.Method.invoke(Method.java:511) 04-10 00:35:23.095: W/System.err(16428): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 04-10 00:35:23.100: W/System.err(16428): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 04-10 00:35:23.100: W/System.err(16428): at dalvik.system.NativeStart.main(Native Method) 04-10 00:35:23.100: W/System.err(16428): Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f050040, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment 04-10 00:35:23.105: W/System.err(16428): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:296) 04-10 00:35:23.105: W/System.err(16428): ... 31 more
發佈整個異常堆棧跟蹤。 – Luksprog
補充,希望這有助於!感謝回覆。 – flagg327
如果要將其作爲另一個片段的佈局,則不能在xml佈局(* fragment_map Layout *)中使用該'fragment'標籤。而是使用'MapView'類。 – Luksprog