2016-03-24 9 views
0

У меня есть приложение для карты Google, которое использует карту в фрагменте для отображения карт. Это прекрасно работает, за исключением того, что он не отображает внутренние карты. Я решил создать урезанную версию моего кода, чтобы найти проблему. Он по-прежнему существует :-(Внутренние карты не отображаются в mapView в фрагменте

В документации для закрытых карт он говорит следующее

SetIndoorEnabled 
Sets whether indoor maps should be enabled. Currently, indoor maps can 
only be shown on one map at a time and by default, this is the first map 
added to your application. To enable indoor maps on another map, you 
must first disable indoor maps on the original map. If you try to enable 
indoor maps when it is enabled on another map, nothing will happen and 
this will return false. When Indoor is not enabled for a map, all 
methods related to indoor will return null, or false. 

Я не могу видеть, что я позволил несколько карт, но я, если каким-то образом использование задаюсь фрагмент путает его. Любая помощь/советы будут appeciated.

My MainActivity.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.AppCompatActivity; 

public class MainActivity extends AppCompatActivity { 

    Fragment map_fragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_2); 
     showTheMap(); 
    } 

    public void showTheMap() { 
     map_fragment = new MapFragment(); 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.replace(R.id.map, map_fragment); 
     ft.commit(); 
    } 
} 

MapFrament.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.FrameLayout; 

import com.google.android.gms.maps.CameraUpdate; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapView; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.model.LatLng; 

public class MapFragment extends Fragment { 

private MapView mapView; 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    final FrameLayout parent = (FrameLayout) inflater.inflate(R.layout.fragment_map, container, false); 

    mapView = (MapView) parent.findViewById(R.id.mapfragment); 
    mapView.getMapAsync(new OnMapReadyCallback() { 
          @Override 
          public void onMapReady(GoogleMap googleMap) { 
           CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(-35.0176402, 138.5459909), 17); 
           googleMap.animateCamera(cameraUpdate); 

          } 
         } 
    ); 
    mapView.onCreate(savedInstanceState); 

    return parent; 
} 

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public void onResume() { 
    mapView.onResume(); 
    super.onResume(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mapView.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mapView.onDestroy(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    mapView.onLowMemory(); 
} 

} 

activity_main_2.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

</android.support.design.widget.AppBarLayout> 

<fragment 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    class="com.google.android.gms.maps.MapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

</android.support.design.widget.CoordinatorLayout> 

fragment_map.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<com.google.android.gms.maps.MapView 
    android:id="@+id/mapfragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" /> 

</FrameLayout> 

Если переместить код MainActivity он отлично работает. Смотрите ниже код MainActivity.Java

public class MainActivity extends AppCompatActivity { 

MapView mapView = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_1); 
    mapView = (MapView) findViewById(R.id.map); 
    mapView.getMapAsync(new OnMapReadyCallback() { 
          @Override 
           public void onMapReady(GoogleMap googleMap) { 

            CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(-35.0176402, 138.5459909), 17); 
            googleMap.animateCamera(cameraUpdate); 

           } 
          } 
     ); 
     mapView.onCreate(savedInstanceState); 
} 


@Override 
protected void onStart() { 
    super.onStart(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    mapView.onResume(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mapView.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mapView.onDestroy(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    mapView.onLowMemory(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
} 


@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    mapView.onSaveInstanceState(outState); 
} 
} 

activity_main_1 XML для этого ....

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout  
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context="com.example.program.MainActivity"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

</android.support.design.widget.AppBarLayout> 

<com.google.android.gms.maps.MapView 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" /> 

</android.support.design.widget.CoordinatorLayout> 

ответ

0

Ниже приводится решение моей проблемы.

Declare myGoogleMap в MainActivity

public static GoogleMap myGoogleMap = null; 

В onMapReady добавить эти строки в качестве первого действия, чтобы сделать

if (MainActivity.myGoogleMap != null) { 
    MainActivity.myGoogleMap.setIndoorEnabled(false); 
    googleMap.setIndoorEnabled(true); 

    MainActivity.myGoogleMap = googleMap; 

    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(-35.0176402, 138.5459909), 17); 
    MainActivity.myGoogleMap.animateCamera(cameraUpdate); 
} 

Кажется, как будто getMapAsync вызывается дважды и, следовательно, 2 карты Google созданы, отображается вторая.

Поскольку внутренние карты отображаются только на первой карте, вы должны установитьIndoorEnabled для false для первой карты, а затем setIndoorEnabled для true для второго.

Это кажется изворотливым для меня. Не уверен, что это ошибка или мое непонимание.

 Смежные вопросы

  • Нет связанных вопросов^_^