2008-11-04 39 views
17

Tôi đang cố gắng điều khiển thu phóng hiển thị trong một số mapview, mã sau gần như hoạt động nhưng các điều khiển thu phóng xuất hiện ở phía trên cùng bên trái của mapview, chứ không phải ở giữa dưới cùng như tôi đang chỉ định qua setGravity(). Ai đó có thể khai sáng cho tôi về những gì tôi đang thiếu?Đặt Điều khiển Thu phóng trong MapView

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); 

Các chế độ xem/bố cục này đều được lập trình theo cấu trúc, không có tệp bố cục nào để tinh chỉnh.

Trả lời

0

Làm lại - sự cố khi sử dụng FILL_PARENT là điều khiển thu phóng rồi "đánh cắp" tất cả các sự kiện chạm; để bạn không thể xoay bản đồ trong khi các điều khiển thu phóng hiển thị. Bạn có biết cách ngăn chặn điều này không?

+0

Bạn nói đúng. Đã không nhận thấy điều đó. Đã thay thế câu trả lời trước đó bằng giải pháp tốt hơn tránh được sự cố này. –

19

Bí quyết ở đây là đặt một vùng chứa Bố cục khác nơi bạn muốn đặt ZoomControls và sau đó chèn ZoomControls vào đó.

Bí quyết thực sự là để sử dụng RelativeLayout hơn LinearLayout đến vị trí các yếu tố, như thể hiện trong mẫu này layout.xml:

<?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> 

Các layout_zoom yếu tố LinearLayout được bố trí ở trung tâm phía dưới màn hình, đặt nó trên giữa/dưới của MapView.

Sau đó, trong vòng Hoạt động của bạn onCreate, có được một tham chiếu đến yếu tố layout_zoom và chèn ZoomControl vào nó, giống như bạn đã làm: bây giờ

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); 

Các ZoomControls sẽ xuất hiện trên một nhấp chuột dài , mà không đánh cắp sự kiện chạm vào bản đồ.

+0

Xin chào, tôi có thể chỉnh sửa câu trả lời của bạn để thêm triển khai trên WebView không? Chỉ cần một vài 4-5 dòng. Tôi sử dụng google và tìm thấy giải pháp này. Nhưng, để sử dụng nó trên WebView, tôi cần phải sửa đổi một chút. – ariefbayu

4

Reto: cảm ơn câu trả lời của bạn, nhưng ý tưởng là làm điều đó mà không cần sử dụng bố cục XML.

Cuối cùng tôi đã giải quyết được sự cố. Bởi vì một MapView là một lớp con của ViewGroup, bạn có thể dễ dàng thêm các khung nhìn con (như các điều khiển thu phóng). Tất cả những gì bạn cần là một phiên bản MapView.LayoutParams và bạn tốt để đi. Tôi đã làm một cái gì đó như thế này (đặt điều khiển thu phóng ở trung tâm dưới cùng của mapview).

// 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); 
2

Đáng tiếc là tôi không thể thêm một bình luận cho Jason Hudgins phê duyệt giải pháp từ 28 tháng 11 tại 6:32 nhưng tôi có một lỗi nhỏ với mã của mình:

Trong dòng này:

MapView.LayoutParams params = MapView.LayoutParams(

Lỗi Eclipse đã cho tôi là

"Phương thức LayoutParams (int, int, int, int, int) không xác định cho lần thứ e loại MapView "

thay vào đó, tạo MapView mới.LayoutParams đối tượng cố định nó, như thế này:

MapView.LayoutParams params = **new** MapView.LayoutParams(

Tôi đã mất một thời gian để tìm hiểu, vì tôi là một n00b: D

2

từ google groups thread tôi thấy điều này:

ZoomControls mà không XML:

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); 

} 

là 100% làm việc cho tôi với SDK1.1

23

Thêm dòng sau vào phương pháp OnCreate() của MapView Lớp của bạn:

view.setBuiltInZoomControls(true);

7

ở trên không làm việc cho tôi, nhưng điều này không (để đặt sự kiểm soát ở phía dưới bên phải):

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; 
    } 
} 
+0

Cuối cùng. Câu trả lời hoạt động mà KHÔNG gọi phương thức getZoomControls() không dùng nữa. Kudos cho bạn. Cảm ơn. –

+0

Tuyệt vời, một giải pháp tốt hơn cho phép bạn giữ lại các điều khiển thu phóng được tích hợp hoàn chỉnh với chức năng mờ dần vào/ra. Cảm ơn! –

Các vấn đề liên quan