0

我目前正在開發一個使用Xamarin.Android的android應用程序。在這個應用程序中,我使用DrawerLayout(來自支持庫v4)來顯示我的應用程序內容和一個菜單,我可以通過按下工具欄中的按鈕或向右滑動來打開。MapFragment非常緩慢,勉強迴應

在抽屜的第一部分(頁面內容)中,我有一個工具欄取代了經典動作欄,搜索欄和我的MapFragment。

在菜單部分,我有一個scrollview包含一個linearlayout,它本身包含一些像按鈕,textview等元素,用戶將用於連接或註冊。

菜單滑動順暢,每個元素都正確響應,但mapfragment真的麻煩顯示地圖。幾秒鐘後,它會顯示一個空的網格,我必須點擊該片段才能加載地圖的幾個部分。幾乎沒有控件響應,有時會在很多等待之後進行雙擊,並且永久加載更精確的圖塊。

顯然有東西阻止我的地圖加載正確,但我不知道它是什麼。

這裏是地圖片段:

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/mapFragment" 
      android:layout_marginTop="94dp" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      class="com.google.android.gms.maps.MapFragment" /> 

這裏是我如何加載我的地​​圖中活動文件(在OnCreate功能):

MapFragment mapFrag = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.mapFragment); 
GoogleMap map = mapFrag.Map; 
if(map != null) 
{ 
    // The GoogleMap object is ready to go (well, should be) 
} 

我跟着它來創建我的地圖片段:https://developer.xamarin.com/guides/android/platform_features/maps_and_location/maps/part_2_-_maps_api/

如果需要,我可以提供更多信息。我完全不知道這是從哪裏來的。我在測試應用程序中使用了完全相同的代碼(除了它是一個簡單的線性佈局,沒有抽屜,也沒有保證金),它的工作完美,這就是爲什麼我很困惑。

編輯:讓我的模擬器和手機在寫作時運行應用程序(至少需要五分鐘),但它仍然沒有正確響應。在Genymotion仿真器(API 16)和我的OnePlus One(API 21)上測試,結果相同。

在此先感謝。

+0

您確定載入地圖是什麼導致掛斷? – zgc7009

+2

你有任何網絡問題?假設您的應用程序未創建阻止問題,我會查看您的網絡活動(通過Charles,WireShark等)以檢查來自Google CDN的響應時間。您的手機和Genymotion上的Google地圖應用程序正常嗎? – SushiHangover

+0

是的,我確定地圖是原因,因爲地圖在加載時遇到問題,其他所有內容在應用程序中都完美運行。 @SushiHangover這是我認爲在某些時候,所以我檢查了我的網絡,這似乎工作正常。 WiFi模擬器的光纖配置正確,LTE使用我的手機。我通過使用我提供的xamarin鏈接啓動示例應用程序進行雙重檢查,並且地圖加載並順利響應。問題顯然在我的代碼中,但我發現了一個奇蹟解決方案:SupportMapFragment而不是MapFragment。 – YumeYume

回答

1

我不確定爲什麼它確實是「慢」,它必須處理和加載地圖。

如果您使用抽屜佈局,這意味着每個頁面最有可能是一個片段。這意味着你將在片段中有片段。當我在構建MyDriving示例功能時執行此操作時,我在片段內使用了標準MapView小部件,如果我在活動中,則使用MapFragment

如果使用的MapView控件,你應該在你的片段執行IOnMapReadyCallback來訪問:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     base.OnCreateView(inflater, container, savedInstanceState); 
     HasOptionsMenu = true; 
     var view = inflater.Inflate(Resource.Layout.fragment_current_trip, null); 

     mapView = view.FindViewById<MapView>(Resource.Id.map); 
     mapView.OnCreate(savedInstanceState); 
     return view; 
    } 

    public override void OnActivityCreated(Bundle savedInstanceState) 
    { 
     mapView.GetMapAsync(this); 
     base.OnActivityCreated(savedInstanceState); 
    } 

    GoogleMap map; 
    MapView mapView; 


    public void OnMapReady(GoogleMap googleMap) 
    { 
     map = googleMap; 
    } 

應該當您使用的MapView窗口小部件,還必須經過它清理與注意:

#region MapView Lifecycle Events 

    public override void OnResume() 
    { 
     base.OnResume(); 
     mapView?.OnResume(); 
    } 

    public override void OnPause() 
    { 
     base.OnPause(); 
     mapView?.OnPause(); 
    } 

    public override void OnDestroy() 
    { 
     base.OnDestroy(); 
     mapView?.OnDestroy(); 
    } 

    public override void OnSaveInstanceState(Bundle outState) 
    { 
     base.OnSaveInstanceState(outState); 
     mapView?.OnSaveInstanceState(outState); 
    } 

    public override void OnLowMemory() 
    { 
     base.OnLowMemory(); 
     mapView?.OnLowMemory(); 
    } 

    #endregion 

如果您處於活動狀態並使用MapFragment,那麼您也應該使用相同的樣式,但不需要像MapView控件一樣設置事件:

GoogleMap map; 
SupportMapFragment mapFrag; 

    public async void OnMapReady(GoogleMap googleMap) 
    { 
     map = googleMap; 
    } 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     //Set your layout 

     mapFrag = (SupportMapFragment) SupportFragmentManager.FindFragmentById(Resource.Id.map); 
     mapFrag.GetMapAsync(this); 
    } 

我希望這有助於

+0

我試圖首先使用您的MapView建議,並且無法實現它。所以我決定再次檢查一個片段,但我注意到你使用了一個SupportMapFragment,而不是一個MapFragment。所以我改編了我的代碼,它的工作完美!因此,對於任何可能會遇到延遲映射片段的用戶:SupportMapFragment是奇蹟解決方案!非常感謝 ! – YumeYume