将Google地图放入Viewpager

时间:2015-05-27 07:21:01

标签: android android-viewpager fragment mapfragment

我现在正在关注

中的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

现在我找到了一个解决方案,例如以编程方式制作片段。

请帮帮我。

1 个答案:

答案 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