2016-03-21 70 views
2

我有一個片段(fragment_search),我想以編程方式添加另一個片段(map_fragment),但我遇到了一個問題,其中tab_content.onResume()被調用了BEFORE OnMapReadyCallback.onMapReady()。onResume在onMapReady之前調用

下面的代碼:

fragment_search.xml:

<LinearLayout...> 
    <FrameLayout 
      android:id="@+id/search_map_fragment_container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

     </FrameLayout> 
</LinearLayout> 

some_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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"> 

    <com.google.android.gms.maps.MapView android:id="@+id/mapview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" 
    android:enabled="true" 
    android:apiKey="api key" /> 

</LinearLayout> 

SearchFragment.class(閒來無事在這個類真的):

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_search, container, false); 
    FragmentManager fragmentManager = getFragmentManager(); 
    final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

    final SomeFragment fragment = new SomeFragment(); 

    OnMapReadyCallback onMapReadyCallback = new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(GoogleMap googleMap) { 
      fragment.setMap(googleMap); 

      fragmentTransaction.add(R.id.search_map_fragment_container, fragment); 
      fragmentTransaction.commit(); 
     } 
    }; 
    fragment.getMapAsync(onMapReadyCallback); 
    return view; 
} 

個SomeFragment.class:

public class SomeFragment extends SupportMapFragment { 
    MapView mapView; 
    GoogleMap map; 
    private MapView mMapView; 
    private GoogleMap mGoogleMap; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.some_layout, container, false); 

     mMapView = (MapView) v.findViewById(R.id.mapview); 
     mMapView.onCreate(savedInstanceState); 

     return v; 
    } 

    public void setMap(GoogleMap map){ 
     this.mGoogleMap=map; 
    } 
...} 

堆棧跟蹤:

java.lang.NullPointerException: Attempt to invoke interface method 'void maps.ei.bz.o()' on a null object reference 
                    at maps.ei.n.b(Unknown Source) 
                    at com.google.android.gms.maps.internal.i$a.onTransact(:com.google.android.gms.alldynamite:115) 
                    at android.os.Binder.transact(Binder.java:387) 
                    at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onResume(Unknown Source) 
                    at com.google.android.gms.maps.SupportMapFragment$zza.onResume(Unknown Source) 
                    at com.google.android.gms.dynamic.zza$7.zzb(Unknown Source) 
                    at com.google.android.gms.dynamic.zza.zza(Unknown Source) 
                    at com.google.android.gms.dynamic.zza.onResume(Unknown Source) 
                    at com.google.android.gms.maps.SupportMapFragment.onResume(Unknown Source) 
                    at com.beermeet.ui.search.SearchFragment.onResume(SearchFragment.java:5 

7)

我覺得SearchFragment.onCreateView是錯的,但我不知道是什麼做的正確方法它。 任何提示,我在做什麼錯了?謝謝!

回答

1

當您啓動SearchFragment時,它顯然會將其onResume()方法作爲片段生命週期的一部分。 您的日誌說明onResume()中有NullPointerException。你應該檢查一下。

和關於你的問題,你以前onMapReadyCallback因爲getMapAsync()是異步調用

fragment.getMapAsync(onMapReadyCallback); 

onResume()將被調用,並在不同的線程,不會阻塞UI線程,因此onResume()將你之前被調用運行得到onMapReadyCallback

+0

這是非常有道理的。異步加載地圖的正確方法是什麼? –

+0

你的做法是正確的。根據您的需要,您只需要照顧其他代碼流。 –

+0

如果它是正確的,它會工作,對不對? :)) –

相關問題