0

Android 用の GoogleMaps v2 API アプリを開発していますが、問題が発生しました。次の図のように、ActionBar を (下位互換性のために actionbarsherlock 経由で) 使用したいと思います。

マップの例
(出典: google.com )

私のコードを ActionBar を持つように変更しなくても、私のマップ アプリは素晴らしく機能します。それを使用するようにコードを適合させようとすると、空白の画面とアクションバーが表示されます。したがって、マップ自体またはその他のものが読み込まれます。

前のコード: (関連部分のみ)

public class MapActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Initiate loader, so that files can be acquired in background thread.
        new Loader().execute();   
    }
    .
    .
    .
}

インポートや変数は含めていません。コードはコンパイルされるので、心配する必要はありません。

後のコード:

public class MapActivity extends SherlockFragmentActivity {


    public boolean onCreate(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(0,SEARCH,0,"Search")
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        // Initiate loader, so that files can be acquired in background thread.
        new Loader().execute();
        return true;
    }

    public boolean onOptionsItemSelected (MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case SEARCH:
                openSearchView();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    .
    .
    .
}

編集 -

マップ設定コード: (mapクラス変数として宣言されていることに注意してください)

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

 // Recovers map choice from previous activity.
    Intent intent = getIntent();
    map_descriptor = intent.getStringExtra(MAP);
    MAP_CENTER = map2LatLng(map_descriptor);

    map = setupMap(map);

    // Initiate loader, so that files can be acquired in background thread.
    new Loader().execute();   
}

public GoogleMap setupMap(GoogleMap map) {
    if (map == null) {
        map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
        // Just in case null map was accidently passed to setupMap.
    }
    map.setMapType(3); // TERRAIN
    CameraPosition cameraPosition = new CameraPosition.Builder()
    .target(MAP_CENTER)                 
    .zoom(ZOOM_LEVEL)
    .build();

    map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    map.setOnCameraChangeListener(new OnCameraChangeListener() {
        public void onCameraChange(CameraPosition cameraPosition) {
                ZOOM_LEVEL = cameraPosition.zoom;
                recenterMap(ZOOM_LEVEL);
        }
    });

    return map;
}

XML レイアウト コード:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment"/>
4

2 に答える 2

1

ActionBarSherlockでMapsV1を使用する場合は、マップをサポートするためのアドオンJARが必要です。基本的にはMapActivityActionBarSherlockについて知っています。

ActionBarSherlockでMapsV2を使用する場合は、通常、このサンプルアプリのように、フラグメントを介してマップをロードします。サンプルコードは、そこにマップを取得する方法を示していないため、マップが表示されない理由を推測することは困難です。

于 2013-02-19T18:59:46.857 に答える
1

SherlockFragmentActivity のコンテンツ ビューを適切に設定していないか、マップがセットアップされる予定のときにマップをセットアップしていません。

onCreate メソッドでは、super.onCreate() を呼び出した後に必ず次のようにします。

setContentView(R.layout.activity_main);
map = setupMap();

どこかから情報をダウンロードしている場合でも (またはその非同期タスクで何をしていても)、コンテンツ ビューを設定して、onCreate でマップを適切に拡張する必要があります。

また、onCreate から setupMap を呼び出していることを確認する必要があります。後でマーカーを追加できます。

API v2 がリリースされた日から Google Maps Android API v2 で SherlockFragmentActivity を使用してきましたが、問題はなかったので、ビューを作成する順序である必要があります。

于 2013-02-19T22:11:46.727 に答える