0

Google Maps Android APIを使用してアプリを開発しています。アプリは、ユーザーがオンとオフを切り替えることができるさまざまなタイル オーバーレイを表示します。デバイスを回転させてもオーバーレイはそのまま残りますが、ボタンをクリックしてオーバーレイをオフにすると、オーバーレイを制御する変数が null であるかのようにデバイスが動作します。このような状況でタイル オーバーレイを制御するにはどうすればよいですか。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    SupportMapFragment mapFragment =
            (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

    //mMap=null;
    if (savedInstanceState == null) {
        // First incarnation of this activity.
        mapFragment.setRetainInstance(true);
    } else  {
        // Reincarnated activity. The obtained map is the same map instance in the previous
        // activity life cycle. There is no need to reinitialize it.
        mMap = mapFragment.getMap();
    }
    setUpMapIfNeeded();
    setUpFieldsIfNeeded();
}
private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
          // Try to obtain the map from the SupportMapFragment.
             mMap  = ((SupportMapFragment)   getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

          }
        }
      }
 private void setUpFieldsIfNeeded(){            

    if (fieldsOverlay == null) {
        TileProvider tileProvider = new UrlTileProvider(256, 256) {
            @Override
            public synchronized URL getTileUrl(int x, int y, int zoom) {


                //String s = String.format(Locale.US, CMAFieldsRequestFormat, zoom, x, y);  
                String s = String.format(Locale.US, cartoDBFieldsTile, zoom, x, y); 
                s =s.replace(" ", "%20");
                System.out.println(s);
                URL url = null;
                try {
                    url = new URL(s);
                } catch (MalformedURLException e) {
                    throw new AssertionError(e);
                }
                return url;
            }
        };


         fieldsOverlay = mMap.addTileOverlay(
                 new TileOverlayOptions().tileProvider(tileProvider));
         fieldsOverlay.setVisible(false);
         fieldsOverlay.setZIndex(1);}

    }

TLDR: fieldsOverlay という名前の tileOverlay で Google マップを使用しています。デバイスを回転すると、オーバーレイ自体は保持されますが、変数 fieldsOverlay には接続されなくなります。この問題を解決する最善の方法は何ですか。

ありがとう

編集: mMap.clear を実行してから、レイヤーを再初期化し、アクティビティを再生するときに可視性を savedInstanceState 値に設定することで、アプリが希望どおりに機能するように見えるようにすることができましたが、これは良い解決策とは思えません.

4

1 に答える 1

1

を使用SupportMapFragment.setRetainInstaceすると、目的の結果がすぐに得られるように思えるかもしれませんが、実際にはそうではありません。

まず第一に、メモリリークが発生します。それについての議論については、私のgmaps-api-issueをチェックしてください。

そこで遭遇する問題はごく普通のことです。TileOverlay保持している参照は、再作成時に保持されませんActivity。実際に新しいActivityオブジェクトが作成されます。ビジュアル オブジェクトは、通常の Android のように扱う必要がありViewます。構成が変更された場合は保持されません。公式ドキュメントにもこれに関するメモがありましたが、今は見つかりません。

使用しない場合はsetRetainInstance、オブジェクトへの参照がなくても問題はありません。回転時に再度作成する必要があるためです。

于 2013-08-16T21:59:12.390 に答える