使用Google Maps API v2的ViewPager:神秘的黑色视图

Pep*_*epe 95 android google-maps android-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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*elt 115

通过在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>
Run Code Online (Sandbox Code Playgroud)

  • 并不是的.我刚刚注意到缩放和位置控件位于地图表面顶部的位置没有出现黑色轨迹,因此我在顶部放置了一个视图以覆盖整个地图并且工作正常.我同意它并不完美 - 黑色背景似乎是GLSurfaceView窗口的一部分http://code.google.com/p/gmaps-api-issues/issues/detail?id=4639 (7认同)
  • 好像它修复了我的ViewPager问题.谢谢,但看起来我有一个类似的问题w/SlideMenu(左侧菜单,如G + /雅虎),做同样的事情..有关修复SlideMenu实现的任何想法? (5认同)

Lub*_*cek 43

与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;
}
Run Code Online (Sandbox Code Playgroud)

  • 当接受的答案没有时,这对我有用. (2认同)

Tsp*_*oon 7

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Nam*_*los 6

我的解决方法:使用GoogleMap的新快照界面,并在滚动页面时显示地图的快照.

这是我设置快照的代码(它与map相同,称为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

"mapFragment"是我的SupportedMapFragment,"iv"是ImageView(make it 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) {}
    });
Run Code Online (Sandbox Code Playgroud)

我的带有map(FragmentMap)的片段位于位置1,所以我需要控制从位置0到1以及从位置1到2(第一个if子句)的滚动."getRegisteredFragment()"是我的自定义FragmentPagerAdapter中的一个函数,其中我有一个名为"registeredFragments"的SparseArray(Fragment).

因此,无论何时滚动到地图或从地图滚动,您总能看到它的快照.这对我很有用.