带有Google Maps API v2的ViewPager:神秘的黑色视图

我已经集成了新的谷歌地图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; } } 

我能够通过在FrameLayout中的ViewPager顶部放置另一个透明背景的视图来阻止转换后留下的黑色表面:

 <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相同的问题。 我注意到地图片段中的控件button在工件左侧不是黑色的。 我通过覆盖MapFragment (SupportMapFragment)onCreateView()方法解决了这个问题,

 @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的新版本,它们使用服务器端标志)

这是我用来绕过这个问题 – 确保你不会浪费任何CPU周期设备> = 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(使其匹配)。

在这里,我正在控制卷轴:

 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中的一个函数,其中我有一个名为“registeredFragments”的SparseArray(片段)。

所以,无论您何时从地图上滚动,都会看到快照。 这对我来说很好。

我有列表视图滚动黑屏相同的问题,我在同一个屏幕上使用列表视图的地图片段我已经解决了这个问题, 在xml中我使用的魔术属性我说话列表视图只是我们必须把android: scrollingCache =“false”。我的问题是固定的试试这个属性来阻止滞后和闪烁在你的地图。

你没有给出太多的细节,所以我只能提出很多build议。 我有一个类似的问题,屏幕在浏览器中的视图之间闪烁。 原来是第一次在页面之间交换时的mapView膨胀。

为了清楚起见,我在寻呼机中有3页,而我的地图是最后一页。

为了解决这个问题,我发现设置屏幕外页面的数量为2(这在上面的情况下工作),当我的片段开始它一次加载所有的意见。

请参阅http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int

还有一个解决这个问题的方法。 我在另一个片段中显示MapFragment。 MapFragment被dynamic添加到FrameLayout中。

解决方法是在滑动菜单的打开和closures事件上使用frameLayout.setVisibility(View.Visible)和frameLayout.setVisibility(View.Gone)。 它dosent需要额外的观点被添加。 黑色的地方完全消失了。

 getSlidingMenu().setOnOpenListener( new OnOpenListener() { @Override public void onOpen() { frameLayout.setVisibility(View.GONE); } }); getSlidingMenu().setOnClosedListener( new OnClosedListener() { @Override public void onClosed() { frameLayout.setVisibility(View.VISIBLE); } }); 

上述方法都没有为我工作,甚至没有其他人在其他地方find。 最后,我select了一个部分解决scheme。 我通过ViewPager的onPageChangeListener监听页面更改,并在页面开始滚动时隐藏地图,同样在停止滚动时再次显示。 我也添加了一个白色的视图滚动时显示。

只需将我的自定义地图片段复制到您的项目。 如果你有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(); } 

}