2017-01-17 24 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()は、別のフラグメント内にあるフラグメントにアクセスしようとしている場合にのみ使用されます。アクティビティ内の断片にアクセスするには、getSupportFragmentManager() –

+0

@AshishJohnに感謝します。これは私にとって完璧に機能しました。 –