Android 带有谷歌地图API v2的ViewPager:神秘的黑色视图

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() {

我已经将新的GoogleMapsAPIv2片段集成到了一个视图寻呼机中。从地图片段滚动时,黑色视图与相邻片段重叠。有人解决了吗

编辑:截图

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