【问题标题】:Map inside scrollview not scrollable滚动视图内的地图不可滚动
【发布时间】:2016-08-29 10:30:47
【问题描述】:

我在垂直滚动视图中有一个地图片段。我希望它是可滚动的。但它不工作。 我尝试从这些答案中添加透明图像以及自定义 Scrollview: how to set google map fragment inside scroll view

Google Maps API v2 SupportMapFragment inside ScrollView - users cannot scroll the map vertically

我的布局结构:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.TripDetailsActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ECF0F1"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:id="@+id/card_map"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorCard"
            android:orientation="vertical"
            android:weightSum="12">

            <TextView
                android:id="@+id/tripTxt"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="20dp"
                android:layout_marginBottom="5dp"
                android:layout_weight="3"
                android:text="Trip"
                android:textColor="@color/colorTextCard"
                android:textSize="20sp" />

            <fragment
                android:id="@+id/map"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="300dp"
                android:layout_margin="10dp"
                tools:context="com.example.keelindemo.Activities.Map" />

            <TextView
                android:id="@+id/start_point"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_marginLeft="10dp"
                android:layout_weight="2"
                android:drawableLeft="@drawable/flag_start"
                android:drawablePadding="10dp"
                android:gravity="center_vertical"
                android:textColor="@color/colorTextCard" />

            <TextView
                android:id="@+id/end_point"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_marginBottom="10dp"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="10dp"
                android:layout_weight="2"
                android:drawableLeft="@drawable/flag_end"
                android:drawablePadding="10dp"
                android:gravity="center_vertical"
                android:textColor="@color/colorTextCard" />

        </LinearLayout>

    </android.support.v7.widget.CardView>

请提出一些解决方案。我正在棉花糖上尝试一切。

【问题讨论】:

  • 建议您改用NestedScrollView - 他们添加了一些不错的增强功能,顾名思义就是“嵌套滚动”

标签: android android-layout android-maps-v2 android-maps


【解决方案1】:

您可以在滚动视图中滚动谷歌地图。 请参阅下面的链接,我描述了如何在 android 的滚动视图中滚动地图: http://newtech4you4ever.blogspot.in/2016/08/scroll-googlemap-in-scrollview-android.html

【讨论】:

  • 我试过了,它在自定义类中抛出空指针异常。 public void setListener(OnTouchListener listener) { mListener = listener;此方法显示未使用,因此为 null mLListener
  • 可以创建接口OnTouchListener吗?
  • 你已经创建了它.. 所以是的,接口在代码中
  • 我更改了 MainActivity 代码。我更改了 GoogleMap 的声明。请检查它。
  • 现在成功了,非常感谢!顺便在你博客的更新代码中更改变量名..
【解决方案2】:

你可以试试下面的代码,看看它是否适合你。

View customView = null;
ScrollView scrollViewParent = null;

scrollViewParent = (ScrollView) v.findViewById(R.id.scrollViewParent);
customView = (View) v.findViewById(R.id.customView);

customView.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.
            scrollViewParent.requestDisallowInterceptTouchEvent(true);
            // Disable touch on transparent view
            return false;

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

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

        default:
            return true;
        }
    }
});

现在在 XML 文件中

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollViewParent"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
        <fragment
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.google.android.gms.maps.SupportMapFragment" />

        <View
            android:id="@+id/customView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@android:color/transparent" />
</ScrollView>

【讨论】:

    【解决方案3】:
    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);
            }
        }
    }
    

    在您的活动/片段中,在 onCreate/onViewCreated 中添加以下代码

    ScrollView nScrollView = (ScrollView) findViewById(R.id.scrollViewParent);
                MySupportMapFragment mSupportMapFragment;
                mSupportMapFragment = (MySupportMapFragment) getChildFragmentManager().findFragmentById(R.id.googleMap);
    
                mSupportMapFragment.setListener(new MySupportMapFragment.OnTouchListener() {
                            @Override
                            public void onTouch() {
                                mScrollView.requestDisallowInterceptTouchEvent(true);
                            }
                        });
    
                if (mSupportMapFragment != null) {
                    mSupportMapFragment.getMapAsync(new OnMapReadyCallback() {
                        @Override
                        public void onMapReady(GoogleMap googleMap) {
                            if (googleMap != null) {
                                googleMap.getUiSettings().setAllGesturesEnabled(true);
                                googleMap.getUiSettings().setZoomControlsEnabled(true);
                                LatLng marker_latlng = new LatLng(lat, lon);
                                CameraPosition cameraPosition = new CameraPosition.Builder().target(marker_latlng).zoom(15.0f).build();
                                CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
                                googleMap.moveCamera(cameraUpdate);
                                if (latitude != null && longitude != null) {
                                        googleMap.addMarker(new MarkerOptions().position(marker_latlng).title("Address"));
    }
                            }
                        }
                    });
                }
    

    &你的布局是这样的

    <fragment
            android:id="@+id/googleMap"
            class="com.yourpackagename.MySupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2020-08-18
      • 2013-07-25
      相关资源
      最近更新 更多