4

フラグメントとビューページャーを使用して、タブ レイアウトで Google マップを読み込むことができました。縦向きと横向きの両方で機能します。アプリを最初にロードすると、マップ タブに切り替えると、マップがロードされ、緯度と経度が事前に定義されたマーカーでカメラがアニメーション化し、現在の場所が有効になります。ただし、タブを変更してからマップタブに戻ると、ロケーションファインダーボタン (左上のボタン) がなくなり、マーカーがなくなったため、カメラが設定したマーカーにアニメーション化されず、マップにアフリカが表示されます。

マップタブのコードは次のとおりです。

TabTwo.java

public class TabTwo extends Fragment {

private static View view;
/**
 * Note that this may be null if the Google Play services APK is not
 * available.
 */

private static GoogleMap map;
private static Double latitude, longitude;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if (container == null) {
        return null;
    }
    view = inflater.inflate(R.layout.activity_tab_two, container, false);
    // Passing harcoded values for latitude & longitude. Please change as per your need. This is just used to drop a Marker on the Map
            latitude = 14.6353475;
            longitude = 121.0327501;

            setUpMapIfNeeded(); // For setting up the MapFragment

    return view;
}

/***** Sets up the map if it is possible to do so *****/
public static void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (map == null) {
        // Try to obtain the map from the SupportMapFragment.
        map = ((SupportMapFragment) MainActivity.fragmentManager
                .findFragmentById(R.id.map)).getMap();
        // Check if we were successful in obtaining the map.
        if (map != null)
            setUpMap();
    }
}

/**
 * This is where we can add markers or lines, add listeners or move the
 * camera.
 * <p>
 * This should only be called once and when we are sure that {@link #mMap}
 * is not null.
 */
private static void setUpMap() {
    // For showing a move to my loction button
    map.setMyLocationEnabled(true);
    // For dropping a marker at a point on the Map
    map.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("Estuar Building").snippet("Work Place"));
    // For zooming automatically to the Dropped PIN Location
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude,
            longitude), 12.0f));
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    if (map != null)
        setUpMap();

    if (map == null) {
        // Try to obtain the map from the SupportMapFragment.
        map = ((SupportMapFragment) MainActivity.fragmentManager
                .findFragmentById(R.id.map)).getMap();
        // Check if we were successful in obtaining the map.
        if (map != null)
            setUpMap();
    }
}

/**** The mapfragment's id must be removed from the FragmentManager
 **** or else if the same it is passed on the next time then 
 **** app will crash ****/
@Override
public void onDestroyView() {
    super.onDestroyView();
    try {
        Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
        FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
        ft.remove(fragment);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void onDetach() {
    super.onDetach();
    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);
    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

}

助けが必要。ありがとう!

4

1 に答える 1

1

マップはアフリカを表示します = マップは GPS (0,0) を表示します。どこでも、いつでも。:)

あなたsetUpMapsIfNeededはバグです。UI にあるマップ オブジェクトは、マップ変数にあるマップではありません。すべての UI 変数を常に再入力する必要があります。onCreateView

Android は、フラグメントが表示されなかったときにビューを再作成します。ビュー上の(そしてユーザーに見える)マップオブジェクトは、変数にあるものではありません。

電話しないと

map = ((SupportMapFragment)MainActivity.fragmentManager.findFragmentById(R.id.map)).getMap();

で新しいビューを作成するonCreateViewたびに、正しいマップが得られず、すべてのセットアップ コードが機能しなくなります。

于 2013-10-16T07:53:37.443 に答える