9

Google Maps AndroidAPIv2をAndroidアプリケーションに統合しようとしています。レイアウトの真ん中にGoogleマップを配置しています。レイアウトが画面に収まる場合はうまく機能しますが、レイアウトが大きすぎて収まらない場合、ユーザーが下にスクロールして残りのコンテンツを表示すると、残りのレイアウトはGoogleマップによって黒く塗りつぶされます。次のスクリーンショットを参照してください。

問題のスクリーンショット

(注:ユーザーがスクロールできるように、すべてのマップジェスチャが無効になっています。)

私のレイアウトXML:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:fillViewport="true" >

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="20sp" >

    <TextView
        android:id="@+id/race_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="14sp"
        android:textSize="@dimen/DetailsTop"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/race_in_chase" />
    <TextView
        android:id="@id/race_in_chase"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/in_the_chase"
        android:textSize="@dimen/DetailsTop"
        android:background="@drawable/inthechase"
        android:paddingLeft="20sp"
        android:paddingRight="20sp"
        android:visibility="gone"
        android:layout_alignParentRight="true" />

    <TextView
        android:id="@+id/race_name"
        style="@style/RaceDetailsName"
        android:layout_below="@id/race_num" />
    <TextView
        android:id="@+id/race_track"
        style="@style/RaceDetailsText"
        android:paddingBottom="20sp"
        android:layout_below="@id/race_name" />

    <TextView
        android:id="@+id/race_time"
        style="@style/RaceDetailsText"
        android:layout_below="@id/race_track" />
    <TextView
        android:id="@+id/race_tv"
        style="@style/RaceDetailsText"
        android:layout_below="@id/race_time" />

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="380dp"
        android:layout_marginTop="20sp"
        android:layout_marginBottom="20sp"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_below="@id/race_tv" />

    <TextView
        android:id="@+id/race_track_size"
        style="@style/RaceDetailsText"
        android:layout_below="@id/map" />

</RelativeLayout>

</ScrollView>

アクティビティでのマップの設定:

private void setUpMapIfNeeded() {
    if (mMap == null) {
        mMap = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map)).getMap();
        if (mMap != null) {
            setUpMap();
        }
    }
}

private static final LatLng CHICAGOLAND = new LatLng(41.474856, -88.056928);

private void setUpMap() {
    mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
    mMap.getUiSettings().setZoomControlsEnabled(false);
    mMap.getUiSettings().setAllGesturesEnabled(false);
    CameraPosition cameraPosition = new CameraPosition.Builder()
        .target(CHICAGOLAND)
        .zoom(14.5f)
        .bearing(53)
        .build();
    mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}

私の勘では、レイアウト全体が画面に収まり、スクロールが必要ない場合、レイアウトが適切であれば、マップフラグメントはScrollViewを好みません。マップ自体は正しいサイズのようです。ブラックアウトは、ビュー内の残りのアイテムの正確なサイズです。マップの下の停電を取り除き、その下のTextViewを表示する方法を知っている人はいますか?私が今まで試したすべてがうまくいきませんでした。

4

8 に答える 8

2

私はハックで問題を回避することができました。ScrollViewを拡張して、スクロールイベントに関する通知を受け取ることができるようにしました。Synchronize ScrollViewのスクロール位置(android)のObservableScrollView実装を使用しました。

onCreate()に追加しました:

ObservableScrollView sv = (ObservableScrollView) findViewById(R.id.scroll);
sv.setScrollViewListener(this);

次に、スクロール変更イベントを受信すると、ビュー全体の表示を切り替えます。これにより、再レイアウトが強制され、ブラックボックスが表示されなくなります。

public void onScrollChanged(ObservableScrollView sv, int x, int y, int oldx, int oldy) {
    sv.setVisibility(View.GONE);
    sv.setVisibility(View.VISIBLE);
}

マップビューをinvalid()して、マップビューだけの表示を切り替えようとしましたが、どちらも機能しませんでした。ありがたいことに、ビュー全体の表示を切り替えることで、ちらつきやその他の奇妙な動作が発生することはありません。

おそらくもっと良い解決策があるでしょうが、現時点では、これがうまくいくように見える唯一のものです。

于 2012-12-12T13:05:47.607 に答える
1

onPageScrolledFragmentPagerAdapterでオーバーライドすることにより、Viewpagerの同じ問題に上記を適応させることができました。

@Override
public void onPageScrolled(int position, float positionOffset, 
                           int positionOffsetPixels) {
    if ((position == 0 && positionOffsetPixels > 0) ||
        (position == 1 && positionOffsetPixels == 0)) {
        MyFragment blackedOutFragment = (MyFragment) getSupportFragmentManager()
                .findFragmentByTag("android:switcher:" + R.id.pager + ":1");
        if (blackedOutFragment != null) {
            blackedOutFragment.getView().setVisibility(View.GONE);
            blackedOutFragment.getView().setVisibility(View.VISIBLE);
        }
    }
}

ビューページャーの位置が0MapFragmentを保持しているフラグメントであり、position1がスクロール後にブラックアウトされるフラグメントです。

于 2013-01-25T02:47:38.793 に答える
1

私の回避策: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:18:32.960 に答える
0

単なる実験ですが、マップがすでに初期化された後、setupMap()でプログラムによって画面にTextViewを追加しようとしましたか?

// First, get a handle on the parent RelativeLayout, 
// call it parentRelativeLayout, then…                  

TextView textView = new TextView(getActivity());
RelativeLayout.LayoutParams textLayout = new RelativeLayout.LayoutParams(
    RelativeLayout.MATCH_PARENT, 
    RelativeLayout.MATCH_PARENT
);
textLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, -1);
textView.setLayoutParams(textLayout);

parentRelativeLayout.addView(textView)
于 2012-12-10T15:23:05.533 に答える
0

私の推測では、アクティビティの初期化中のMapFragmentの高さは0です。で試してみてください

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="20sp" >

....

      <TextView
            android:id="@+id/race_track_size"
            style="@style/RaceDetailsText"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="2dp"/>

</RelativeLayout>
于 2012-12-10T11:45:59.110 に答える
0

これは、表面ビューを透明にすることで修正する必要があります

https://github.com/NyxDigital/NiceSupportMapFragment

于 2013-06-25T14:30:01.557 に答える
0

もう1つの可能性は、新しいGoogleMap.snapshot()関数を使用し、代わりにここで説明するようにマップのスクリーンショットを使用することです。

于 2013-08-13T14:59:09.497 に答える
0

このライブラリを使用できます、

https://github.com/NyxDigital/NiceSupportMapFragment/

これは私にとってはうまくいきます。

于 2013-10-15T21:13:15.967 に答える