2015-05-27 1 views
0

Я теперь после руководства ViewPager вДубликат ошибки идентификатора, если положить карту Google в каждом фрагменте 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 страницы сразу в первый раз и И.Д. фрагмент карты ныряет дублируется.

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

Не объявляйте фрагмент mapview в макете, а добавляйте SupportMapFragment во время выполнения, используя FragmentTransaction. –

+0

@Arun Kumar 3 Хорошо, попробуй. Но есть ли причина? Im newbee, пожалуйста, объясните мне. –

ответ

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; 
} 
} 

Конечно, вы должны добавьте xml для fragment_mapinfofragment