2012-12-10 31 views
10

Tôi đang cố gắng tích hợp Google Maps Android API v2 vào Ứng dụng Android của mình. Tôi đang đặt Google Map ở giữa bố cục của tôi. Nó hoạt động tuyệt vời khi bố cục có thể vừa với màn hình, nhưng khi bố cục quá lớn để vừa, và người dùng cuộn xuống để xem phần còn lại của nội dung, phần còn lại của bố cục bị Google Map bôi đen. Xem ảnh chụp màn hình sau đây:Google Maps API Android V2 bôi đen một phần bố cục

Screenshot of the issue

(Lưu ý:. Tất cả những cử chỉ bản đồ bị vô hiệu hóa để cho phép người dùng di chuyển)

My layout XML:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:scrollbars="vertical" 
android:fillViewport="true" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="20sp" > 

    <TextView 
     android:id="@+id/race_num" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="14sp" 
     android:textSize="@dimen/DetailsTop" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@+id/race_in_chase" /> 
    <TextView 
     android:id="@id/race_in_chase" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/in_the_chase" 
     android:textSize="@dimen/DetailsTop" 
     android:background="@drawable/inthechase" 
     android:paddingLeft="20sp" 
     android:paddingRight="20sp" 
     android:visibility="gone" 
     android:layout_alignParentRight="true" /> 

    <TextView 
     android:id="@+id/race_name" 
     style="@style/RaceDetailsName" 
     android:layout_below="@id/race_num" /> 
    <TextView 
     android:id="@+id/race_track" 
     style="@style/RaceDetailsText" 
     android:paddingBottom="20sp" 
     android:layout_below="@id/race_name" /> 

    <TextView 
     android:id="@+id/race_time" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/race_track" /> 
    <TextView 
     android:id="@+id/race_tv" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/race_time" /> 

    <fragment 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="380dp" 
     android:layout_marginTop="20sp" 
     android:layout_marginBottom="20sp" 
     class="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_below="@id/race_tv" /> 

    <TextView 
     android:id="@+id/race_track_size" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/map" /> 

</RelativeLayout> 

</ScrollView> 

thiết lập bản đồ của tôi trong Hoạt động của tôi:

private void setUpMapIfNeeded() { 
    if (mMap == null) { 
     mMap = ((SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map)).getMap(); 
     if (mMap != null) { 
      setUpMap(); 
     } 
    } 
} 

private static final LatLng CHICAGOLAND = new LatLng(41.474856, -88.056928); 

private void setUpMap() { 
    mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
    mMap.getUiSettings().setZoomControlsEnabled(false); 
    mMap.getUiSettings().setAllGesturesEnabled(false); 
    CameraPosition cameraPosition = new CameraPosition.Builder() 
     .target(CHICAGOLAND) 
     .zoom(14.5f) 
     .bearing(53) 
     .build(); 
    mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
} 

Linh cảm của tôi là đoạn bản đồ không ot như ScrollView kể từ khi bố trí nếu tốt nếu toàn bộ bố trí phù hợp trên màn hình và di chuyển là không cần thiết. Bản thân bản đồ có vẻ là kích thước chính xác. Việc mất điện là kích thước chính xác của các mục còn lại trong chế độ xem. Có ai có bất kỳ ý tưởng làm thế nào tôi có thể thoát khỏi sự mất điện bên dưới bản đồ để tôi có thể nhìn thấy TextView bên dưới nó? Tất cả mọi thứ tôi đã thử cho đến bây giờ đã không làm việc.

Trả lời

3

Tôi đã có thể khắc phục vấn đề bằng hack. Tôi mở rộng ScrollView để tôi có thể nhận được thông báo về các sự kiện cuộn. Tôi đã sử dụng triển khai ObservableScrollView từ Synchronise ScrollView scroll positions - android.

tôi thêm vào onCreate của tôi():

ObservableScrollView sv = (ObservableScrollView) findViewById(R.id.scroll); 
sv.setScrollViewListener(this); 

Sau đó, khi tôi nhận được một cuộn thay đổi sự kiện, tôi chuyển tầm nhìn của toàn bộ quan điểm, mà buộc một tái bố trí, trong đó ngăn chặn hộp đen xuất hiện.

public void onScrollChanged(ObservableScrollView sv, int x, int y, int oldx, int oldy) { 
    sv.setVisibility(View.GONE); 
    sv.setVisibility(View.VISIBLE); 
} 

Tôi đã cố gắng vô hiệu hóa() chế độ xem bản đồ và chuyển đổi chế độ hiển thị của chế độ xem bản đồ nhưng không hoạt động. Rất may khi bật chế độ hiển thị toàn bộ khung nhìn không gây ra bất kỳ nhấp nháy nào hoặc hành vi lạ khác.

Có thể có giải pháp tốt hơn, nhưng tại thời điểm này, đây là điều duy nhất tôi thấy rằng có vẻ như hoạt động.

+0

Thực sự không nhấp nháy? Tôi đã thử giải pháp này với SlidngMenu, nhưng nó không thay đổi gì cả. Xem này để biết chi tiết: http://stackoverflow.com/questions/14419521/moving-mapfragment-surfaceview-causes-black-background-flickering/14571989#comment20335526_14571989 –

+0

tôi có editTexts dưới bản đồ và tôi sử dụng này, chỉnh sửa văn bản thua tiếp theo tập trung, làm thế nào tôi có thể làm điều đó, hoặc là có một cách khác? – JRowan

0

Tôi đoán chiều cao của MapFragment là 0 trong quá trình khởi tạo của Hoạt động. Hãy thử với

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:padding="20sp" > 

.... 

     <TextView 
      android:id="@+id/race_track_size" 
      style="@style/RaceDetailsText" 
      android:layout_alignParentBottom="true" 
      android:layout_marginBottom="2dp"/> 

</RelativeLayout> 
+0

Cảm ơn đề xuất của bạn. Thật không may, nó không hoạt động. Tôi vẫn còn có thanh màu đen, và lint đang ném cảnh báo này: RelativeLayout này nên sử dụng android: layout_height = "wrap_content". Bất kỳ ý tưởng nào khác? – meisteg

+0

Giống như một thử nghiệm - bạn đã thử đặt TextView trong câu hỏi phía trên mảnh bản đồ chưa? Điều gì sẽ xảy ra khi bạn làm điều đó? – DiscDev

+0

Tôi đã thử di chuyển TextView. Thanh màu đen vẫn xuất hiện bên dưới bản đồ, nhưng nó nhỏ hơn vì có ít bố cục hơn (chỉ bố cục đệm/lề). – meisteg

0

Chỉ cần thử nghiệm, nhưng bạn đã thử thêm TextView vào màn hình theo lập trình trong setupMap() sau khi Bản đồ đã được khởi tạo chưa?

// First, get a handle on the parent RelativeLayout, 
// call it parentRelativeLayout, then…     

TextView textView = new TextView(getActivity()); 
RelativeLayout.LayoutParams textLayout = new RelativeLayout.LayoutParams(
    RelativeLayout.MATCH_PARENT, 
    RelativeLayout.MATCH_PARENT 
); 
textLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, -1); 
textView.setLayoutParams(textLayout); 

parentRelativeLayout.addView(textView) 
1

tôi đã có thể thích ứng trên cho cùng một vấn đề trong một ViewPager bằng cách ghi đè onPageScrolled trong FragmentPagerAdapter:

@Override 
public void onPageScrolled(int position, float positionOffset, 
          int positionOffsetPixels) { 
    if ((position == 0 && positionOffsetPixels > 0) || 
     (position == 1 && positionOffsetPixels == 0)) { 
     MyFragment blackedOutFragment = (MyFragment) getSupportFragmentManager() 
       .findFragmentByTag("android:switcher:" + R.id.pager + ":1"); 
     if (blackedOutFragment != null) { 
      blackedOutFragment.getView().setVisibility(View.GONE); 
      blackedOutFragment.getView().setVisibility(View.VISIBLE); 
     } 
    } 
} 

đâu vị trí 0 trong ViewPager là một Fragment cầm một MapFragment và vị trí 1 là Fragment bị bôi đen sau khi cuộn.

0

Một khả năng khác là sử dụng mới GoogleMap.snapshot() chức năng và sử dụng một ảnh chụp màn hình của bản đồ thay vì như mô tả here.

1

workaround của tôi: tận dụng các mới snapshot interface from GoogleMap và hiển thị một bản chụp của bản đồ trong khi di chuyển trang.

Đây là mã của tôi để thiết lập các ảnh chụp (đó là trong đoạn tương tự như bản đồ, gọi FragmentMap.java):

public void setSnapshot(int visibility) { 
    switch(visibility) { 
    case View.GONE: 
     if(mapFragment.getView().getVisibility() == View.VISIBLE) { 
      getMap().snapshot(new SnapshotReadyCallback() { 
       @Override 
       public void onSnapshotReady(Bitmap arg0) { 
        iv.setImageBitmap(arg0); 
       } 
      }); 
      iv.setVisibility(View.VISIBLE); 
      mapFragment.getView().setVisibility(View.GONE); 
     } 
     break; 
    case View.VISIBLE: 
     if(mapFragment.getView().getVisibility() == View.GONE) { 
      mapFragment.getView().setVisibility(View.VISIBLE); 
      iv.setVisibility(View.GONE); 
     } 
     break; 
    } 
} 

đâu "mapFragment" là SupportedMapFragment tôi và "iv" là một ImageView (chắc nó match_parent).

Và ở đây tôi đang kiểm soát các cuộn:

pager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      if(position == 0 && positionOffsetPixels > 0 || position == 1 && positionOffsetPixels > 0) { 
       ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.GONE); 
      } else if(position == 1 && positionOffsetPixels == 0) { 
       ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.VISIBLE); 
      } 
     } 
     @Override 
     public void onPageScrollStateChanged(int arg0) {} 
     @Override 
     public void onPageSelected(int arg0) {} 
    }); 

mảnh của tôi với bản đồ (FragmentMap) là vị trí 1, vì vậy tôi cần để điều khiển cuộn từ vị trí 0 đến 1 và từ vị trí từ 1 đến 2 (mệnh đề if đầu tiên). "getRegisteredFragment()" là một hàm trong FragmentPagerAdapter tùy chỉnh của tôi, trong đó tôi có một SparseArray (Fragment) được gọi là "registeredFragments".

Vì vậy, bất cứ khi nào bạn di chuyển đến hoặc từ bản đồ của bạn, bạn luôn nhìn thấy một bản chụp của nó. Điều này làm việc rất tốt cho tôi.

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