我正在尝试制作一个包含带有 3 个选项卡的 ActionBar 的应用程序:“地图”、“目的地”和“关于我们”。基本上,我使用 ViewPager 作为主要布局,对于单个寻呼机视图,我使用 Fragments。
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,并且运行良好。地图有效。
异常堆栈跟踪
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