0

マップ上のオーバーレイがDPAD/タブからフォーカスを受け取る可能性はありますか?

リストビューとマップビューの2つのフラグメントがあり、オーバーレイのドローアブルからフォーカスを取得したいのですが、それが可能かどうかはわかりません...

4

2 に答える 2

2

はい、MapViewの1つのオーバーレイアイテムから別のオーバーレイアイテムに移動できますが、考慮すべきことがいくつかあります。

  1. Dpadで上/下/左を押しながらMapViewをDpadの方向に従って操作する場合、マップは上/下/左方向に移動してマップを表示し、MapViewにはオーバーレイアイテムをDpadできません。集中。
  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を押すとトーストが表示されますが、ここにコンテンツを表示できます。

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 に答える