2012-06-15 73 views
0

地圖上的重疊可能會從DPAD/Tab獲得焦點嗎?重疊之間的導航

我有兩個片段,一個ListView和MapView的,我想從覆蓋的繪製獲得焦點,但我不確定是否it's可能的...

回答

2

是的,你可以從一個覆蓋項目上的MapView轉移到其他但也有,你應該考慮幾件事情。

  1. 如果你希望你的MapView駕馭根據使用Dpad方向同時按下上/下/左上使用Dpad,那麼你的地圖會去上/下/左方向顯示的地圖,你不會能夠使用Dpad上覆蓋因爲MapView有重點。
  2. 但是,如果你想覆蓋項目被聚焦,那麼你必須手動定義哪個覆蓋項目應該集中在使用setFocus,nextFocus和getFocus方法的哪個D-Pad方向類。
  3. 此外,你說你在你的活動中有listview和MapView,爲了讓焦點返回到listview或任何其他MapView外的視圖也必須以編程方式完成,這可能有點棘手。

您可以使用StateListDrawable來定義覆蓋繪製的焦點,按下和默認狀態的不同狀態。

希望這能回答您的查詢。

1

我創建低於樣本活動。大部分代碼來自於此處的MapView教程:http://developer.android.com/resources/tutorials/views/hello-mapview.html

「焦點代碼」位於onKeyDown()方法中。當按下TAB鍵時,焦點會轉移到下一個覆蓋層。按下ENTER後,會顯示一個Toast,但這是您可以顯示內容的地方。

的的setFocus()方法的文檔中被發現的ItemizedOverlay在這裏找到:https://developers.google.com/maps/documentation/android/reference/

希望這個作品。

public class OverlayFocusExampleActivity extends MapActivity { 
private HelloItemizedOverlay itemizedoverlay; 
private MapView mapView; 
private MapController mapController; 
private int currentOverlayIndex; 

/* 
* This entire method comes from the MapView tutorial. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mapView = (MapView) findViewById(R.id.mapview); 
    mapView.setBuiltInZoomControls(true); 
    mapController = mapView.getController(); 
    List<Overlay> mapOverlays = mapView.getOverlays(); 

    // overlay_draw is a selector that specifies a different image for state_focused 
    Drawable drawable = this.getResources().getDrawable(R.drawable.overlay_draw); 
    itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

    GeoPoint point = new GeoPoint(19240000, -99120000); 
    OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!"); 
    itemizedoverlay.addOverlay(overlayitem); 
    GeoPoint point2 = new GeoPoint(35410000, 139460000); 
    OverlayItem overlayitem2 = new OverlayItem(point2, "Sekai, konichiwa!", "I'm in Japan!"); 

    itemizedoverlay.addOverlay(overlayitem2); 


    mapOverlays.add(itemizedoverlay); 
} 

@Override 
protected boolean isRouteDisplayed() { 
    return false; 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    OverlayItem overlay; 
    switch (keyCode) { 
     case KeyEvent.KEYCODE_TAB: 
      // Retrieve next overlay 
      currentOverlayIndex = (currentOverlayIndex + 1) % itemizedoverlay.size(); 
      overlay = itemizedoverlay.getOverlayItem(currentOverlayIndex); 

      itemizedoverlay.setFocus(overlay); 

      // Since setFocus() doesn't center the map, we do it ourselves 
      mapController.animateTo(overlay.getPoint()); 
      return true; 


     case KeyEvent.KEYCODE_DPAD_CENTER: 
     case KeyEvent.KEYCODE_ENTER: 
      overlay = itemizedoverlay.getFocus(); 

      if (overlay != null) { 
       // Perform associated action 

       // Stub 
       Toast.makeText(this, overlay.getSnippet(), Toast.LENGTH_SHORT).show(); 
       return true; 
      } 


     default: 
      return false; 
    } 
} 


/* 
* This entire class comes from the MapView tutorial except getOverlayItem(). 
*/ 
private class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem> { 
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
    private Context mContext; 


    public HelloItemizedOverlay(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
    } 

    public HelloItemizedOverlay(Drawable defaultMarker, Context context) { 
     super(boundCenterBottom(defaultMarker)); 
     mContext = context; 
    } 

    public void addOverlay(OverlayItem overlay) { 
     mOverlays.add(overlay); 
     populate(); 
    } 

    /* 
    * Not in MapView tutorial. Added for focusability. 
    */ 
    public OverlayItem getOverlayItem(int index) { 
     return mOverlays.get(index); 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     return mOverlays.get(i); 
    } 

    @Override 
    public int size() { 
     return mOverlays.size(); 
    } 

    @Override 
    protected boolean onTap(int index) { 
     OverlayItem item = mOverlays.get(index); 
     AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 
     dialog.setTitle(item.getTitle()); 
     dialog.setMessage(item.getSnippet()); 
     dialog.show(); 
     return true; 
    } 
} 

}