2017-01-17 12 views
1

У меня есть NestedScrollView в качестве родителя и фрагмент, содержащий googleMap в качестве его дочернего элемента. Когда я прокручиваю вниз или вверх по карте, NesetdScrollView прокручивается, и я не могу прокручивать карту. До сих пор я попробовал решение из переполнения стека, создав прозрачное изображение, но это не сработало для меня.Google Map Фрагмент прокрутки внутри NestedScrollView

XML:

<android.support.v4.widget.NestedScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/car_progress" 
     android:id="@+id/nested_scroll" 
     android:visibility="gone" 

     > 
............ 
............ 
<RelativeLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_below="@id/first_section" 
       android:visibility="gone" 
       android:id="@+id/map_wrapper" 
       android:orientation="vertical" 
       android:layout_marginTop="10dp" 
       > 

       <TextView 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/dealer_location" 
        android:textAllCaps="true" 
        android:textColor="@color/colorPrimary" 
        style="@style/BoldStyle" 
        android:layout_marginLeft="@dimen/single_title_dimen" 
        android:layout_marginRight="@dimen/single_title_dimen" 
        android:id="@+id/dealer_head" 

        /> 

       <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="match_parent" 
        android:layout_height="200dp" 
        android:id="@+id/map" 
        android:name="com.google.android.gms.maps.SupportMapFragment" 
        android:layout_below="@+id/dealer_head" 
        /> 
       <ImageView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:id="@+id/imagetrans" 
        android:layout_alignTop="@+id/map" 
        android:layout_alignBottom="@+id/map" 
        android:layout_alignEnd="@+id/map" 
        android:layout_alignRight="@+id/map" 
        android:layout_alignLeft="@+id/map" 
        android:layout_alignStart="@+id/map" 
        android:src="@android:color/transparent"/> 

      </RelativeLayout> 
..... 
..... 
</android.support.v4.widget.NestedScrollView> 

Код:

transImg.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       int action = event.getAction(); 
       switch (action) { 
        case MotionEvent.ACTION_DOWN: 
         // Disallow ScrollView to intercept touch events. 
         nv.requestDisallowInterceptTouchEvent(true); 
         // Disable touch on transparent view 
         return false; 

        case MotionEvent.ACTION_UP: 
         // Allow ScrollView to intercept touch events. 
         nv.requestDisallowInterceptTouchEvent(false); 
         return true; 

        case MotionEvent.ACTION_MOVE: 
         nv.requestDisallowInterceptTouchEvent(true); 
         return false; 

        default: 
         return true; 
       } 
      } 
     }); 

ответ

9

Попробуйте ... использовать этот пользовательский фрагмент карты с осязаемой оберткой.

MySupportMapFragment mSupportMapFragment; 
mSupportMapFragment = (MySupportMapFragment) getChildFragmentManager().findFragmentById(R.id.googleMap); 
if(mSupportMapFragment != null) 
     mSupportMapFragment.setListener(new MySupportMapFragment.OnTouchListener() { 
     @Override 
     public void onTouch() { 
      scrollView.requestDisallowInterceptTouchEvent(true); 
     } 
    }); 

MySupportMapFragment

public class MySupportMapFragment extends SupportMapFragment { 

    private OnTouchListener mListener; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 

     View layout = super.onCreateView(inflater, parent, savedInstanceState); 

     TouchableWrapper frameLayout = new TouchableWrapper(getActivity()); 
     frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent)); 
     ((ViewGroup) layout).addView(frameLayout, 
       new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 

     return layout; 
    } 

    public void setListener(OnTouchListener listener) { 
     mListener = listener; 
    } 

    public interface OnTouchListener { 
     public abstract void onTouch(); 
    } 

    public class TouchableWrapper extends FrameLayout { 

     public TouchableWrapper(Context context) { 
      super(context); 
     } 

     @Override 
     public boolean dispatchTouchEvent(MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        mListener.onTouch(); 
        break; 
       case MotionEvent.ACTION_UP: 
        mListener.onTouch(); 
        break; 
      } 
      return super.dispatchTouchEvent(event); 
     } 
    } 
} 
+0

Я не мог получить доступ к getChildFragmentManager() от деятельности. –

+0

getChildFragmentManager() используется только в том случае, если вы пытаетесь получить доступ к фрагменту, который находится внутри другого фрагмента. Чтобы получить доступ к fragement внутри Activity, мы используем getSupportFragmentManager() –

+0

благодаря @AshishJohn, это отлично сработало для меня. –