본문 바로가기

Android/기타

[Android] ScrollView 안에 MapFragment 넣기

반응형

프로젝트를 진행하던 중에 MapFragment를 ScrollView 안에 넣어야 하는 작업이 있었는데 나중에 똑같은 일이 생길까봐 남겨놓고자 합니다.

 

지금까지 나와있는 방법들을 살펴보면 원리는 다음과 같다.

1. 실제 Map이 깔리는 View 위에 또 하나의 터치가 가능한 View를 추가한다.

2. 추가된 View의 터치 이벤트에 따라 scrollview의 requestDisallowInterceptTouchEvent를 설정한다.

 

여기서 추가되는 View는 Fragment의 바로 위에 둘 수도 있고 SupportMapFragment를 상속받은 클래스에서 직접 추가하는 방법도 있는데 여기서는 나중에 사용의 용이성을 위해 SupportMapFragment를 상속받은 클래스로 구현을 하고자 합니다.

 

1. SupportMapFragment 상속받은 클래스 만들기

public class ScrollableMapFragment extends SupportMapFragment {

	private OnTouchListener listener;

	@Override
	public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstance) {
		View layout = super.onCreateView(layoutInflater, viewGroup, savedInstance);

		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) {
		this.listener = listener;
	}

	public interface OnTouchListener {
		void onActionDown();
		void onActionUp();
	}

	public class TouchableWrapper extends FrameLayout {

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

		@Override
		public boolean dispatchTouchEvent(MotionEvent event) {
			if (listener == null) {
				return super.dispatchTouchEvent(event);
			}

			switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					listener.onActionDown();
					break;
				case MotionEvent.ACTION_UP:
					listener.onActionUp();
					break;
			}
			return super.dispatchTouchEvent(event);
		}
	}
}

<SupportMapFragment를 상속받은 클래스>

 

2. xml에 있던 기존의 MapFragment 부분에서 클래스 바꿔주기

<fragment
            android:id="@+id/a_message_detail_map"
            android:name="com.depman.memorycarrier.messagedetail.ScrollableMapFragment"
            android:layout_width="match_parent"
            android:layout_height="144dp"
            android:layout_below="@+id/a_message_detail_location_rl"
            tools:context="com.depman.memorycarrier.messagedetail.MessageDetailActivity" />

<layout에 있는 xml 수정>

 

3. 마지막으로 호출하는 Activity 혹은 Fragment에서 Listener를 다음과 같이 구현하여 세팅해주기

ScrollableMapFragment mapFragment = (ScrollableMapFragment) getSupportFragmentManager().findFragmentById(R.id.a_message_detail_map);
assert mapFragment != null;
mapFragment.setListener(new ScrollableMapFragment.OnTouchListener() {
	@Override
	public void onActionDown() {
		scrollView.requestDisallowInterceptTouchEvent(true);
	}

	@Override
	public void onActionUp() {
		scrollView.requestDisallowInterceptTouchEvent(false);
	}
});

<호출하는 쪽에서의 코드>

반응형