叠加层之间的导航

时间:2012-06-15 14:24:05

标签: android google-tv

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

我有两个片段,一个listview和mapview,我想从叠加的drawable中获得焦点,但我不确定它是否可能......

2 个答案:

答案 0 :(得分:2)

是的,您可以从MapView上的一个覆盖项移动到其他项目,但是您应该考虑的事情很少。

  1. 如果你希望你的MapView在Dpad上向上/向下/向左按下时按照Dpad方向转向,那么你的地图将向上/向下/向左显示地图,你不能在MapView上覆盖物品上的Dpad正在关注焦点。
  2. 但是如果你想要重点聚焦项目,那么你必须使用ItemizedOverlay类的setFocus,nextFocus和getFocus方法手动定义它应该关注哪个D-Pad方向的覆盖项目。
  3. 另外你说你的活动中有listview和MapView,为了让焦点回到listview或者MapView之外的任何其他视图也必须以编程方式完成,这可能有点棘手。
  4. 您可以使用StateListDrawable在焦点,按下和默认状态的重叠drawable上定义不同的状态。

    希望这可以回答您的问题。

答案 1 :(得分:1)

我在下面创建了一个示例活动。大多数代码来自此处的MapView教程:http://developer.android.com/resources/tutorials/views/hello-mapview.html

'焦点代码'位于onKeyDown()方法中。按下TAB时,焦点将移至下一个叠加层。按下ENTER时,它会显示Toast,但您可以在此处显示内容。

在此处找到的ItemizedOverlay文档中找到了setFocus()方法: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;
    }
}

}