【问题标题】:Duplicate id error when put Google map in each fragment of Viewpager将 Google 地图放入 Viewpager 的每个片段时出现重复 id 错误
【发布时间】:2015-05-28 14:06:21
【问题描述】:

我现在正在关注浏览器指南

http://developer.android.com/training/implementing-navigation/lateral.html

我遇到了一个严重的问题。

正如我在标题中所写,我试图将谷歌地图 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

现在我正在寻找一种解决方案,例如以编程方式制作片段。

请帮帮我。

【问题讨论】:

  • 不要在布局中声明 mapview 片段,而是在运行时使用 FragmentTransaction 添加 SupportMapFragment。
  • @Arun Kumar 3 好的,我试试。但有原因吗?我是新手,请解释一下。

标签: android android-viewpager fragment mapfragment


【解决方案1】:

好的,我找到了一个解决方案,它可能是一种解决方法,但效果很好。

我想做的是一个具有地图片段的浏览器。

首先我对下面的网站做了一个基本的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2021-12-17
    • 2013-07-02
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多