2015-04-08 2 views
0

Я просмотрел множество вопросов, но, похоже, не могу заставить их работать. Из того, что я могу понять, мне нужно уничтожить карту, чтобы она снова загружалась в следующий раз, когда я ее открываю, но не могу ее обработать.Google Maps Google сбой при второй загрузке

В настоящее время, что у меня есть ниже XML макет:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/map"> 

</RelativeLayout> 

</RelativeLayout> 

Тогда в моем основном коде у меня есть:

public class ParkMap extends FragmentActivity implements GoogleMap.OnMarkerClickListener{ 

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

    setContentView(R.layout.activity_park_map); 
    setUpMapIfNeeded(); 

    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    mMap.setMyLocationEnabled(true); 
    mMap.getUiSettings().setZoomControlsEnabled(true); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    setUpMapIfNeeded(); 
    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    mMap.setMyLocationEnabled(true); 
    mMap.getUiSettings().setZoomControlsEnabled(true); 
} 

public void setUpMapIfNeeded() { 
try { 
     //SupportMapFragment mMapFragment; 
     mMapFragment = SupportMapFragment.newInstance(); 
     FragmentTransaction fragmentTransaction = 
       getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.add(R.id.map, mMapFragment); 
     fragmentTransaction.commit(); 

     if (mMap == null) { 
      // Try to obtain the map from the SupportMapFragment. 
      //mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
      //.getMap(); 
      mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    // Do a null check to confirm that we have not already instantiated the map. 

     if (mMap != null) { 
      mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); 
     } 
    } 


    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

на уничтожить то, что я пытался реализовать от каких других постов я прочитал, но он не работает. Он также рушится при повороте экрана, поэтому я считаю, что это просто изменение, которое он не ловит.

Спасибо.

LogCat:

04-08 15:36:20.043 13303-13303/com.zoome.zoomeapp E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.zoome.zoomeapp, PID: 13303 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.zoome.zoomeapp/com.zoome.zoomeapp.ParkMap}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
     at android.app.ActivityThread.access$800(ActivityThread.java:135) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5001) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
     at com.zoome.zoomeapp.ParkMap.onCreate(ParkMap.java:98) 
     at android.app.Activity.performCreate(Activity.java:5231) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 
at android.app.ActivityThread.access$800(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 

+0

post stack trace –

+0

как я могу получить его из работающего приложения, поскольку это происходит только тогда, когда я загружаю apk на телефон, а не при запуске в отладке в андроид-студии, поскольку рабочий стол не распознает устройство для подключения – Navvy

ответ

0

попробовать этот подход:

иметь свой собственный класс MapFragment с ожидаемым поведением.

на вашем XML-фрагменте Fragmentactivity, создайте FrameLayout и дайте ему идентификатор (например, map_container).

Создайте метод для вашей фрагментации, который пытается заменить фрагмент (map_container) внутри фрейма на свой собственный класс. если он не сработает (throw exception), попробуйте добавить его (заменить и добавить методы FragmentManager.)

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

надеюсь, что это поможет. и да, ловушка была бы оценена, чтобы узнать, что такое ошибка.

пожалуйста, попробуйте этот подход:

FragmentManager fm = null; 
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    fm = getActivity().getSupportFragmentManager(); 
} else { 
    fm = getChildFragmentManager(); 
} 
SupportMapFragment fragment = (SupportMapFragment) 
fragment = findFragmentById(R.id.my_map_fragment); 
mMap = fragment.getMap(); 
+0

I как вы предположили, но теперь получить исключение с нулевым указателем, не знаете, где я поступил неправильно, но отредактировал код выше – Navvy

+0

, можете ли вы опубликовать логарифм нулевого указателя? Благодарю. – CptEric

+0

Добавлено в выше спасибо – Navvy

0

Если вы хотите, чтобы уничтожить фрагмент, когда приложение закрывается, OnDestroy не всегда срабатывает непосредственно. Вы можете переместить код удаления в onPause, чтобы проверить, поможет ли это вам.

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    MapFragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    if (f != null){ 
     getFragmentManager().beginTransaction().remove(f).commit(); 
    } 
} 

становится:

@Override 
public void onPause() { 
    super.onPause(); 
    MapFragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    if (f != null){ 
     getFragmentManager().beginTransaction().remove(f).commit(); 
    } 
} 
0

Я также сталкивался с подобной ситуацией несколько дней назад. Вам просто нужно прокомментировать, что mMap.setMapType (GoogleMap.MAP_TYPE_NORMAL); и повторите попытку. И, пожалуйста, дайте мне знать, что произойдет.