ViewPager с Google Maps API v2: таинственный черный вид
я интегрировал новый фрагмент Google maps api v2 в пейджер просмотра. При прокрутке фрагмента карты черный вид перекрывает соседние фрагменты. Кто-то решил?
изменить: скриншот

public static class PagerAdapter extends FragmentPagerAdapter{
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
Fragment pageFragment;
switch (position) {
case 0:
pageFragment = new TabAFragment();
break;
case 1:
pageFragment = new TabBFragment();
break;
case 2:
pageFragment = SupportMapFragment.newInstance();
break;
default:
pageFragment = null;
break;
}
return pageFragment;
}
}
9 ответов:
я смог остановить черную поверхность, оставленную после перехода, поместив другой вид с прозрачным фоном поверх
ViewPagerвнутриFrameLayout:<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager> <!-- hack to fix ugly black artefact with maps v2 --> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" /> </FrameLayout>
была такая же проблема с SlidingMenu и ViewPager. Я заметил, что кнопки управления в фрагменте карты не являются черными в левом артефакте. Я решил проблему, переопределив
onCreateView()методMapFragment (SupportMapFragment)@Override public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle savedInstance) { View layout = super.onCreateView(inflater, view, savedInstance); FrameLayout frameLayout = new FrameLayout(getActivity()); frameLayout.setBackgroundColor( getResources().getColor(android.R.color.transparent)); ((ViewGroup) layout).addView(frameLayout, new ViewGroup.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT ) ); return layout; }
Google выпустила исправление для этого, но только для 4.1+ (вам не нужно загружать новую версию PlayServices, они использовали флаг на стороне сервера)
вот что я использую, чтобы обойти эту проблему-гарантирует, что вы не тратите циклы процессора на устройствах >= 4.1
public class FixMapFragment extends SupportMapFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); // Fix for black background on devices < 4.1 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { setMapTransparent((ViewGroup) view); } return view; } private void setMapTransparent(ViewGroup group) { int childCount = group.getChildCount(); for (int i = 0; i < childCount; i++) { View child = group.getChildAt(i); if (child instanceof ViewGroup) { setMapTransparent((ViewGroup) child); } else if (child instanceof SurfaceView) { child.setBackgroundColor(0x00000000); } } } }
мой обходной путь: используйте новый интерфейс моментального снимка из GoogleMap и отобразить снимок карты при прокрутке страницы.
вот мой код для установки снимка (он находится в том же фрагменте, что и карта, называется FragmentMap.java):
public void setSnapshot(int visibility) { switch(visibility) { case View.GONE: if(mapFragment.getView().getVisibility() == View.VISIBLE) { getMap().snapshot(new SnapshotReadyCallback() { @Override public void onSnapshotReady(Bitmap arg0) { iv.setImageBitmap(arg0); } }); iv.setVisibility(View.VISIBLE); mapFragment.getView().setVisibility(View.GONE); } break; case View.VISIBLE: if(mapFragment.getView().getVisibility() == View.GONE) { mapFragment.getView().setVisibility(View.VISIBLE); iv.setVisibility(View.GONE); } break; } }где "mapFragment" - это мой SupportedMapFragment и" iv " - это ImageView (сделать его match_parent).
и вот я контролирую свиток:
pager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == 0 && positionOffsetPixels > 0 || position == 1 && positionOffsetPixels > 0) { ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.GONE); } else if(position == 1 && positionOffsetPixels == 0) { ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.VISIBLE); } } @Override public void onPageScrollStateChanged(int arg0) {} @Override public void onPageSelected(int arg0) {} });мой фрагмент с картой (FragmentMap) находится на позиции 1, поэтому мне нужно контролировать прокрутку с позиции 0 до 1 и с позиции 1 до 2 (первое предложение if). "getRegisteredFragment ()" - это функция в моем пользовательском FragmentPagerAdapter, в которой у меня есть SparseArray (фрагмент), называемый"registeredFragments".
таким образом, всякий раз, когда вы прокручиваете или от вашей карты, вы всегда видите снимок его. Это очень хорошо работает для меня.
У меня была такая же проблема черного экрана при прокрутке списка, я использовал фрагмент карты со списком в том же экране я решил эту проблему с использованием магического свойства в xml где я говорю вид списка просто мы должны поставить android: scrollingCache= "false".моя проблема исправлена попробуйте это свойство, чтобы остановить отставание и мерцание в ваших картах.
вы не даете много деталей, так что есть только так много я могу предложить. У меня была аналогичная проблема, что экран мерцал между видами в пейджере. Оказалось, что mapView раздувается при первом обмене между страницами.
чтобы быть ясным, у меня было 3 страницы в моем пейджере, и моя карта была последней страницей.
чтобы решить эту проблему, я обнаружил, что установка количества страниц вне экрана на 2 (это сработало в случае выше) , что когда мой фрагмент начал загружаться все взгляды сразу.
см http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit (int)
есть еще одно решение этой проблемы. Я показываю MapFragment в другом фрагменте. MapFragment динамически добавляется в FrameLayout.
решение заключается в использовании так.setVisibility(вид.Видно) и заменить.setVisibility(вид.Нет) при открытии и закрытии мероприятия практично. Это дозент требует дополнительного представления, которое будет добавлено. И черная область полностью исчезла.
getSlidingMenu().setOnOpenListener( new OnOpenListener() { @Override public void onOpen() { frameLayout.setVisibility(View.GONE); } }); getSlidingMenu().setOnClosedListener( new OnClosedListener() { @Override public void onClosed() { frameLayout.setVisibility(View.VISIBLE); } });
ни один из методов выше не работал для меня, даже другие, которые я нашел в другом месте. Наконец, я выбрал частичное решение. Я слушаю изменения страницы через Onpagechangelistener ViewPager и скрываю карту, когда ее страница начинает прокручиваться, а также снова показываю ее, когда она перестает прокручиваться. Я также добавил белый вид, который будет отображаться при прокрутке.
просто скопировать мой пользовательский фрагмент карты в проект. и если у вас есть черные линии с ScrollView сверху и снизу, установите для вашего ScrollView android:fadingEdge="none"
public class CustomMapFragment extends SupportMapFragment { private OnActivityCreatedListener onActivityCreatedListener; public CustomMapFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle savedInstance) { View layout = super.onCreateView(inflater, view, savedInstance); FrameLayout frameLayout = new FrameLayout(getActivity()); frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent)); ((ViewGroup) layout).addView(frameLayout, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); return layout; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getOnActivityCreatedListener() != null) getOnActivityCreatedListener().onCreated(); } public OnActivityCreatedListener getOnActivityCreatedListener() { return onActivityCreatedListener; } public void setOnActivityCreatedListener( OnActivityCreatedListener onActivityCreatedListener) { this.onActivityCreatedListener = onActivityCreatedListener; } public interface OnActivityCreatedListener { void onCreated(); }}
Comments