ズームコントロールをmapview
に表示しようとしていますが、次のコードはほぼ機能しますが、ズームコントロールはmapview
の左上に表示され、中央下には表示されません。 setGravity()
で指定しています。誰かが私が欠けているものについて私に教えてもらえますか?
zoomView = (LinearLayout) mapView.getZoomControls();
zoomView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));
zoomView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
mapView.addView(zoomView);
これらのビュー/レイアウトはすべてプログラムで作成され、Tweakするレイアウトファイルはありません。
MapView
クラスのOnCreate()
メソッドに次の行を追加します。
view.setBuiltInZoomControls(true);
ここでの秘訣は、ZoomControlsを配置する別のLayoutコンテナーを配置し、その中にZoomControlsを挿入することです。
本当の秘訣は、このサンプルlayout.xml
に示すように、RelativeLayout
ではなくLinearLayout
を使用して要素を配置することです。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<com.google.Android.maps.MapView
Android:id="@+id/myMapView"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:enabled="true"
Android:clickable="true"
Android:apiKey="MY_MAP_API_KEY"
/>
<LinearLayout Android:id="@+id/layout_zoom"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_centerHorizontal="true"
/>
</RelativeLayout>
layout_zoom LinearLayout要素は画面の下部中央に配置され、MapView
の中央/下部に配置されます。
次に、アクティビティのonCreate
内で、layout_zoom要素への参照を取得し、すでに行ったように、ZoomControlをその要素に挿入します。
LinearLayout zoomLayout =(LinearLayout)findViewById(R.id.layout_zoom);
View zoomView = myMapView.getZoomControls();
zoomLayout.addView(zoomView, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
myMapView.displayZoomControls(true);
ZoomControlsは、マップのタッチイベントを盗むことなく、ロングクリックで表示されるはずです。
上記は私にはうまくいきませんでしたが、これはうまくいきます(コントロールを右下に配置するため):
mapView.setBuiltInZoomControls(true);
ZoomButtonsController zbc = mapView.getZoomButtonsController();
ViewGroup container = zbc.getContainer();
for (int i = 0; i < container.getChildCount(); i++) {
View child = container.getChildAt(i);
if (child instanceof ZoomControls) {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) child.getLayoutParams();
lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;
child.requestLayout();
break;
}
}
Reto:返信ありがとうございますが、XMLレイアウトを使用してなしというアイデアでした。
私は最終的に問題を解決しました。 MapViewはViewGroupのサブクラスであるため、子ビューを簡単に追加できます(ズームコントロールなど)。必要なのはMapView.LayoutParamsインスタンスだけで、準備は完了です。私はこのようなことをしました(ズームコントロールをマップビューの下部中央に配置します)。
// layout to insert zoomcontrols at the bottom center of a mapview
MapView.LayoutParams params = MapView.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
mapViewWidth / 2, mapViewHeight,
MapView.LayoutParams.BOTTOM_CENTER);
// add zoom controls
mapView.addView(mapView.getZoomControls(), params);
グーグルグループスレッド から私はこれを見つけました:
XMLなしのZoomControls:
public class MyMapActivity extends MapActivity { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout relativeLayout = new RelativeLayout(this);
setContentView(relativeLayout);
final MapView mapView = new MapView(this, DEBUG_MAP_API_KEY);
RelativeLayout.LayoutParams mapViewLayoutParams = new
RelativeLayout.LayoutParams
(RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.FILL_PARENT );
relativeLayout.addView(mapView, mapViewLayoutParams);
RelativeLayout.LayoutParams zoomControlsLayoutParams = new
RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT );
zoomControlsLayoutParams.addRule
(RelativeLayout.ALIGN_PARENT_BOTTOM);
zoomControlsLayoutParams.addRule
(RelativeLayout.CENTER_HORIZONTAL);
relativeLayout.addView(mapView.getZoomControls(),
zoomControlsLayoutParams);
mapView.setClickable(true);
mapView.setEnabled(true);
}
sDK1.1で100%働いていました
あなたはこれを試すことができます:
MapView map = (MapView)findViewById(R.id.mapview);
map.setBuiltInZoomControls(true);
残念ながら、11月28日6:32からJason Hudginsが承認したソリューションにコメントを追加することはできませんが、彼のコードで小さなエラーが発生しました。
この行の内容:
MapView.LayoutParams params = MapView.LayoutParams(
Eclipseが私に与えたエラーは
「メソッドLayoutParams(int、int、int、int、int)は、タイプMapViewに対して未定義です。」
代わりに、新しいMapView.LayoutParamsオブジェクトを作成すると、次のように修正されました。
MapView.LayoutParams params = **new** MapView.LayoutParams(
私はn00bなので、見つけるのに少し時間がかかりました:D
Reto-FILL_PARENTの使用に関する問題は、ズームコントロールがすべてのタッチイベントを「盗む」ことです。ズームコントロールが表示されている間はマップをパンできないようにします。これを防ぐ方法を知っていますか?