0

地图上的叠加层可能会从 DPAD/Tab 获得焦点吗?

我有两个片段,一个列表视图和地图视图,我想从覆盖的可绘制对象中获得焦点,但我不确定这是否可能......

4

2 回答 2

2

是的,您可以从 MapView 上的一个叠加项目移动到另一个,但您应该考虑的事项很少。

  1. 如果您希望 MapView 在按下 Dpad 上/下/左的同时根据 Dpad 方向转向,那么您的地图将向上/下/左方向显示地图,并且您将无法在叠加项目上使用 Dpad,因为 MapView 具有重点。
  2. 但是,如果您希望叠加项目被聚焦,那么您必须使用ItemizedOverlay类的 setFocus、nextFocus 和 getFocus 方法手动定义应该关注哪个 D-Pad 方向的叠加项目。
  3. 您还说您的活动中有 listview 和 MapView ,为了将焦点返回到 listview 或 MapView 之外的任何其他视图也必须以编程方式完成,这可能有点棘手。

您可以使用StateListDrawable在覆盖的可绘制对象上定义焦点、按下和默认状态的不同状态。

希望这能回答您的问题。

于 2012-06-15T21:56:20.117 回答
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;
    }
}

}

于 2012-06-15T20:44:33.400 回答