95

新しい Google マップ 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内側の上に透明な背景を持つ別のビューを配置することで、移行後に黒い表面が残されるのを防ぐことができました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 に答える
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で魔法のプロパティを使用してこの問題を解決しました。 scrollingCache="false" .私の問題は修正されました。このプロパティを試して、マップの遅延やちらつきを止めてください。

于 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

上記の方法はどれもうまくいきませんでした。他の場所で見つけた他の方法でさえもうまくいきませんでした。最後に、部分的な解決策を選択しました。ViewPager の onPageChangeListener を介してページの変更をリッスンし、ページのスクロールが開始されるとマップを非表示にし、スクロールが停止すると再びマップを表示します。スクロール時に表示される白いビューも追加しました。

于 2013-05-29T22:32:18.873 に答える
0

この問題には、もう 1 つの解決策があります。別のフラグメント内に 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 に答える
-2

私のカスタム マップ フラグメントをプロジェクトにコピーするだけです。そして、ScrollView android:fadingEdge="none" に設定された上下に ScrollView を持つ黒い線がある場合

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 に答える