Android 带有谷歌地图API v2的ViewPager:神秘的黑色视图
我已经将新的GoogleMapsAPIv2片段集成到了一个视图寻呼机中。从地图片段滚动时,黑色视图与相邻片段重叠。有人解决了吗 编辑:截图Android 带有谷歌地图API v2的ViewPager:神秘的黑色视图,android,google-maps,android-viewpager,Android,Google Maps,Android Viewpager,我已经将新的GoogleMapsAPIv2片段集成到了一个视图寻呼机中。从地图片段滚动时,黑色视图与相邻片段重叠。有人解决了吗 编辑:截图 public static class PagerAdapter extends FragmentPagerAdapter{ public PagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() {
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;
}
}
你没有给出太多细节,所以我只能提出这么多建议。我有一个类似的问题,屏幕在寻呼机的视图之间闪烁。第一次在页面之间切换时,结果是地图视图膨胀 我的寻呼机有3页,我的地图是最后一页 为了解决这个问题,我发现将屏幕外页面的数量设置为2(这在上面的例子中起作用),当我的片段启动时,它一次加载所有视图
请参见(int)通过将另一个具有透明背景的视图放置在
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>
在滑动菜单和ViewPager上也有同样的问题。我注意到MapFragment中的控制按钮在遗留工件中不是黑色的。 我通过重写
MapFragment(SupportMapFragment)
这个问题还有一个解决方案。我正在另一个片段中显示MapFragment。MapFragment将动态添加到FrameLayout中 解决方案是在滑动菜单的打开和关闭事件上使用frameLayout.setVisibility(View.Visible)和frameLayout.setVisibility(View.Gone)。它不需要添加额外的视图。黑色区域完全消失了
getSlidingMenu().setOnOpenListener(
new OnOpenListener() {
@Override
public void onOpen() {
frameLayout.setVisibility(View.GONE);
}
});
getSlidingMenu().setOnClosedListener(
new OnClosedListener() {
@Override
public void onClosed() {
frameLayout.setVisibility(View.VISIBLE);
}
});
我在滚动列表视图时遇到了同样的黑屏问题,我在同一屏幕中使用了带有列表视图的map fragment,我使用xml中的神奇属性解决了这个问题。我的问题已解决。请尝试此属性以停止地图中的滞后和闪烁。上述方法都不适用于我,甚至我在其他地方找到的其他方法也不适用。最后,我选择了部分解决方案。
我通过ViewPager的onPageChangeListener监听页面更改,并在其页面开始滚动时隐藏地图,同样,在其停止滚动时再次显示地图。我还添加了一个在滚动时显示的白色视图。我的解决方法:使用新视图并在滚动页面时显示地图的快照 下面是我设置快照的代码(它与map位于同一个片段中,称为FragmentMap.java): 其中“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(片段)
因此,无论何时滚动到地图或从地图中滚动,都会看到它的快照。这对我来说非常有效。只需复制到您的项目中即可如果您的ScrollView上下都有黑色线条,则设置为您的ScrollView android:fadingEdge=“none”
}谷歌为此发布了一个补丁,但只针对4.1+(你不需要下载新版本的PlayServices,他们使用了服务器端标志) 下面是我用来绕过这个问题的方法-确保您不会在>=4.1的设备上浪费任何CPU周期
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);
}
}
}
}
公共类FixMapFragment扩展了SupportMapFragment{
@凌驾
创建视图上的公共视图(更平坦的充气机,
视图组容器,
Bundle savedInstanceState){
视图=super.onCreateView(充气机、容器、保存状态);
//修复<4.1设备上的黑色背景
如果(android.os.Build.VERSION.SDK_INT<
android.os.Build.VERSION\u code.JELLY\u BEAN){
setMapTransparent((视图组)视图);
}
返回视图;
}
私有void setMapTransparent(视图组){
int childCount=group.getChildCount();
for(int i=0;i
谢谢,但不起作用。问题是,当更改为其他片段时,地图覆盖的屏幕部分仍为黑色,覆盖了此其他片段的视图。hmmm。我会想一想的。我在页面上找不到setOffscreenPageLimit,你链接到的是不是不止一个设备?也许您的ViewPager和map实现中的几行代码可能有助于更好地理解您的问题。是的,在我尝试的所有设备上都会发生这种情况:三星、htc、android 4.0、2.3等。我已将地图集成到我的应用程序中,并集成到一个只有pager和map的干净小应用程序中,结果相同。@Pepe,请您说,如何从ViewPager
获取GoogleMap
对象?坚持了好几个星期。若你们不理解这个问题,那个么查一下我的问题,你们会发现我的帖子。请回答。我想补充一点,在做屏幕记录时,问题似乎没有发生。太好了!这并不完美,因为有时移动寻呼机时会出现黑色视图的一部分。但现在它不再出现在屏幕上了。谢谢(你对此有什么解释吗?)。我刚刚注意到缩放和位置控件位于地图表面的顶部,黑色轨迹没有出现,因此我在顶部放置了一个视图,以覆盖整个地图,它工作了。我同意它不是完美的——黑色的背景
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) {}
});
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();
}
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);
}
}
}
}