95

我已在视图寻呼机中集成了新的 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;
    }
}
4

9 回答 9

117

ViewPager通过在内部 a 的顶部放置另一个具有透明背景的视图,我能够停止在转换后留下黑色表面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>
于 2012-12-17T08:04:25.073 回答
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;
}
于 2012-12-21T16:23:08.383 回答
7

谷歌为此发布了一个修复程序,但仅适用于 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);
            }
        }
    }
}
于 2013-10-19T09:28:57.570 回答
6

我的解决方法:利用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 中的一个函数,其中我有一个名为“registeredFragments”的 SparseArray(Fragment)。

因此,每当您滚动到地图或从地图滚动时,您总会看到它的快照。这对我来说非常有效。

于 2013-08-14T11:14:05.910 回答
4

我在滚动列表视图时遇到了同样的黑屏问题,我在同一屏幕中使用带有列表视图的地图片段我已经通过使用xml中的魔法属性解决了这个问题,我正在谈论列表视图,我们必须放置android: scrollingCache="false" .my 问题已修复尝试此属性以停止地图中的滞后和闪烁。

于 2013-04-22T09:48:50.947 回答
2

你没有提供太多细节,所以我只能建议这么多。我有一个类似的问题,即屏幕在寻呼机的视图之间闪烁。第一次在页面之间交换时,原来是 mapView 膨胀。

需要明确的是,我的寻呼机中有 3 页,而我的地图是最后一页。

为了解决这个问题,我发现将屏幕外页面的数量设置为 2(这在上述情况下有效),当我的片段启动时,它会立即加载所有视图。

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

于 2012-12-12T10:39:23.107 回答
0

这个问题还有另一种解决方案。我在另一个片段中显示 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);
            }
        });
于 2013-03-02T09:17:47.340 回答
0

上面的方法都不适合我,甚至我在别处找到的其他方法也不起作用。最后,我选择了部分解决方案。我通过 ViewPager 的 onPageChangeListener 监听页面更改,并在其页面开始滚动时隐藏地图,并在停止滚动时再次显示它。我还添加了滚动时显示的白色视图。

于 2013-05-29T22:32:18.873 回答
-2

只需将我的自定义地图片段复制到您的项目中即可。如果您在顶部和底部设置了带有 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();
}

}

于 2013-09-26T07:16:38.020 回答