2013-01-13 61 views
10

我已經將地圖片段(API v2)添加到了我的應用中,地圖覆蓋了整個屏幕,頂部有一個半透明的操作欄。 該活動使用的主題爲android:windowActionBarOverlay設置爲true。隱藏在透明操作欄後面的MyLocation按鈕,如何重新定位?

我也在地圖上啓用了「MyLocationButton」,但由於地圖覆蓋了屏幕的整個高度,該按鈕被操作欄覆蓋。

enter image description here

我怎樣才能使地圖繪製片段下方的操作欄,或在屏幕上,而不是底部的位置按鈕?

+0

http://stackoverflow.com/a/20750956/1066839 – John

回答

0

確保您使用?android:attr/actionBarSize(或?attr/actionBarSize,如果您使用的是ActionBarSherlock)來正確偏移片段的內容。

根據您嘗試完成的效果,將此值應用爲邊距或填充。我猜測,由於半透明ActionBar,你會想嘗試填充,爲了仍然有地圖出現在它後面(並保持透明效果)。我只是不能100%確定填充是否會實際移動「查找我」按鈕...如果不是,那麼可能應用保證金是您唯一的選擇。

查看here查看關於此屬性的示例和更多詳細信息。

+0

正確重新定位「我的位置」按鈕,但透明的操作欄覆蓋圖會丟失,無法顯示實體操作欄。邊距屬性適用於片段父級和片段本身,但填充屬性僅在父級中設置時才起作用。無論哪種方式,這會產生一個可靠的操作欄。 – qubz

1

這已經被提交爲增強(請明星,如果你還沒有)http://code.google.com/p/gmaps-api-issues/issues/detail?id=4670

正如我已經加入了動作條下面我自己查找位置按鈕暫時的解決辦法(我的地圖片段是在RelativeLayout,所以我只是做了alignParentRight並設置了適當的邊界)。

然後在我的onClickHandler我這樣做:

public void onClickHandler(View target) { 
    switch (target.getId()) { 
     case R.id.my_fml_btn:   
     mMap.setMyLocationEnabled(true); 
     View fmlBtn = mMapWrapper.findViewById(2); //mMapWrapper is my RelativeLayout 
     if (fmlBtn != null) fmlBtn.setVisibility(View.INVISIBLE); 
     break; 
    } 
} 

我用hierarchyviewer地發現,由地圖API添加的按鈕的ID。它恰好是添加到地圖的第二個視圖(並設置爲不可見)。

你當然可以用LayoutParams來擺弄這個按鈕來抵消這個按鈕而不是隱藏它,但是這個按鈕只有在setMyLocationEnabled爲true後纔會出現! (在我的使用案例中,我更願意讓用戶在啓動GPS之前決定)

+0

感謝您的鏈接。出演。 – machtnix

+0

它爲我工作!謝謝 – Coderji

6

而不是創建自己的按鈕,只需根據操作欄大小移動內置按鈕即可。
此代碼對我的作品和按鈕只是其中按鈕應該是(像在谷歌地圖):

// Gets the my location button 
View myLocationButton = getSherlockActivity().findViewById(R.id.MainContainer).findViewById(2); 

// Checks if we found the my location button   
if (myLocationButton != null){ 
     int actionBarHeight = 0; 
     TypedValue tv = new TypedValue(); 

      // Checks if the os version has actionbar in it or not 
      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ 
       if (getSherlockActivity().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) 
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); 
      } 
      // Before the action bar was added to the api 
      else if(getSherlockActivity().getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true)){ 
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); 
      } 

     // Sets the margin of the button 
     ViewGroup.MarginLayoutParams marginParams = new ViewGroup.MarginLayoutParams(myLocationButton.getLayoutParams()); 
     marginParams.setMargins(0, actionBarHeight + 20, 20, 0); 
     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams); 
     layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); 
     myLocationButton.setLayoutParams(layoutParams); 
} 


只是把這個代碼在onActivityCreated(如果你把它在onCreateOptionsMenu,也不會3.0之前版本的支持 - 因爲生命週期有不同
另一件事,在「R.id.MainContainer」是地圖碎片的容器

我全光照。 g ActionBar Sherlock,但它也適用於常規操作欄,並進行一些修改。

+0

請嘗試此代碼,如果它能爲您工作,請將其標記爲答案,以便其他人可以使用它。它適用於我.. –

+0

在示例代碼的第二行中,您在findViewById調用中列出了神奇的數字2,這似乎是一種不好的做法。您不包含關於您在哪裏找到該號碼的說明,以及我們是否可以指望該號碼不會更改,特別是如果該號碼不是Google記錄的ID。如果他們決定更改ID,那麼你會被打破。 – Steven

+0

該ID來自hierarchyviewer ..我同意,如果Google會改變它,您還需要更改它。但是你控制了你的發佈,如果谷歌更新他們的谷歌播放服務,你需要在發佈之前實施它。在最糟糕的情況下,如果他們會改變它,檢查層次結構查看器中的新ID。不要忘記,這只是他們將解決這個問題:http://code.google.com/p/gmaps-api問題/細節?id = 4670 –

3

下面(特別是fixMapControlLocations)我已經用ActionBarSherlock解決了這個問題。

我曾經在狹窄的屏幕上出現問題,並且拆分操作欄的旋轉取決於錯誤的偏移量。通過sherlock的isNarrow檢查讓我知道它是否狹窄。

另一個關鍵的變化是我設置myLocation的父母的父視圖的填充。這裏麪包含了所有的控件,基於層次結構查看器是谷歌地圖是如何做到的。 Google歸因標誌位於Surface對象樹中的下一位父項上。看起來不那麼容易移動,所以我可能只會失去底部操作欄的透明度效果,以保持合規性。

protected void onCreate(Bundle savedInstanceState) { 
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map); 
    setUpMapIfNeeded(); 

    getSupportActionBar().setBackgroundDrawable(d); 
    getSupportActionBar().setSplitBackgroundDrawable(d); 
} 

private 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) getSupportFragmentManager() 
       .findFragmentById(R.id.map)).getExtendedMap(); 

     // Check if we were successful in obtaining the map. 
     if (map != null) { 
      setUpMap(); 
     } 
    } 
} 

private void setUpMap() { 
    fixMapControlLocations(); 
    ..... 
} 

private void fixMapControlLocations() { 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    int actionBarHeight = 0; 
    TypedValue tv = new TypedValue(); 
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) 
    { 
     actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); 
    } 

    View myLocationParent = ((View)mapFragment.getView().findViewById(1).getParent()); 
    View myLocationParentParent = ((View)myLocationParent.getParent()); 
    myLocationParentParent.setPadding(0, actionBarHeight, 0, isNarrow()?actionBarHeight:0); 
} 

public boolean isNarrow() { 
    return ResourcesCompat.getResources_getBoolean(getApplicationContext(), 
      R.bool.abs__split_action_bar_is_narrow); 
} 
2

您可以用最近添加GoogleMap.setPadding()方法做到這一點:

map.setPadding(leftPadding, topPadding, rightPadding, bottomPadding); 

從API文檔:

此方法允許您在地圖上定義的可見區域,通過在地圖的四個邊緣中的每一個上設置填充來向地圖發信號通知地圖周圍的地圖部分可能被遮擋。地圖功能將適應填充。例如,在變焦控制,指南針,版權聲明和谷歌的標誌將被移動到適合定義的區域內,攝像機運動將相對於可見光區域的中心等

另見description of how padding works in GoogleMap

相關問題