반응형
프로젝트를 진행하던 중에 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);
}
});
<호출하는 쪽에서의 코드>
반응형
'Android > 기타' 카테고리의 다른 글
[Android] Firebase Analytics, Crashlytics 연동하기 (0) | 2019.08.29 |
---|---|
[Android] 안드로이드 투명도 계산기(Android Opacity Calculator) (0) | 2019.07.04 |
[Android] Pie 변경사항 링크 (0) | 2019.05.29 |
[Android] ERR_CLEARTEXT_NOT_PERMITTED 해결 방법 (0) | 2019.05.28 |
[Android] 안드로이드 에뮬레이터에서 로컬호스트 접속하기 (0) | 2019.05.10 |