我现在正在关注
中的viewpager指南http://developer.android.com/training/implementing-navigation/lateral.html
我遇到了一个严重的问题。
正如我在标题中所写,我试图将Google地图v2放在viewpager的每个片段中,我遇到了这个错误。 (一次生成两个ScreenSlidePageFragment,并为每个它们展开地图。)
Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f0a0059, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment
at android.app.Activity.onCreateView(Activity.java:4835)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at com.maurat.trackuz.ScreenSlidePageFragment.onCreateView(ScreenSlidePageFragment.java:39)
我认为因为这个viewpager第一次一次加载2个页面而地图片段的id被重复。
ScreenSlidePagerAdapter
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Log.d(TAG, "getItem " + position);
return new ScreenSlidePageFragment();
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
ScreenSlidePageFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
Log.d(TAG, "onCreateView");
ViewGroup view = (ViewGroup) inflater.inflate(
R.layout.fragment_screen_slide_page,
container,
false);
return view;
}
fragment_screen_slide_page.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="#C7F464">
<fragment
android:name="com.google.android.gms.maps.MapFragment"
android:id="@+id/map_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
所以我发现并尝试了几种解决方案,但目前尚未找到解决方案。 https://stackoverflow.com/a/14929151/1122517 https://stackoverflow.com/a/14695397/1122517
现在我找到了一个解决方案,例如以编程方式制作片段。
请帮帮我。
答案 0 :(得分:1)
好的,我找到了一个解决方案,它可能是解决方法,但工作得很好。
我想要的是一个 viewpager有地图片段。
首先,我做了一个基本的viewpager参考下面的网站
Using ViewPager for Screen Slides
并创建一个片段类,它是2个嵌套片段的父元素
2个嵌套片段的片段类
public class TPageParentFragment extends Fragment {
private int position = -1;
/* Constructor */
public TPageParentFragment(int position) {
this.position = position;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.fragment_screen_slide_page, container, false);
return rootView;
}
@Override
public void onResume() {
Log.d(TAG, "onResume : " + this.position);
super.onResume();
// Here I add 2 nested fragments
FragmentManager mFragmentManager = getChildFragmentManager();
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
Fragment mapFragment = new TMapFragment();
Fragment mapInfoFragment = new TMapInfoFragment();
fragmentTransaction.add(R.id.fragContainer1, mapFragment);
fragmentTransaction.add(R.id.fragContainer2, mapInfoFragment).commit();
}
}
这个父片段的xml是
<强> fragment_screen_slide_page.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#C7F464">
<FrameLayout
android:id="@+id/fragContainer1"
android:layout_width="fill_parent"
android:layout_height="300dp"/>
<FrameLayout
android:id="@+id/fragContainer2"
android:layout_below="@+id/fragContainer1"
android:layout_width="fill_parent"
android:layout_height="500dp"/>
</RelativeLayout>
所有这些 FrameLayout 都将使用2个嵌套片段进行更改。
2个嵌套片段
<强> TMapFragment 强>
import com.google.android.gms.maps.SupportMapFragment;
public class TMapFragment extends SupportMapFragment {
public TMapFragment(){}
@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
Log.d(TAG, "onCreateView");
View v = super.onCreateView(arg0, arg1, arg2);
initMap();
return v;
}
private void initMap() {
Log.d(TAG, "initMap");
}
}
和
<强> TMapInfoFragment 强>
public class TMapInfoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.fragment_mapinfofragment, container, false);
return rootView;
}
}
当然你需要为 fragment_mapinfofragment 添加一个xml