반응형

프로그래밍/안드로이드+코틀린

반응형
반응형

현재 레이아웃은 위와 같으며 구글 광고와, 지도, 메뉴판, 가게정보가 적혀 있는 탭 레이아웃 사이에 뷰페이저가 들어간다. 그리고 메뉴판 탭에서 메뉴판 사진이 들어가는데 그 때 사진을 Zoom in, Zoom out하려고 PhotoView 라이브러리를 사용했다. 

PhotoView 라이브러리는 chirsbanes/PhotoView 이 링크를 참고하면 된다. 

 

근데 여기서 뷰페이저와 PhotoView라이브러리를 동시에 사용하게 되면 "java.lang.IllegalArgumentException:java.lang.IllegalArgumentException:" 오류와 "E/InputEventReceiver: Exception dispatching input event." 오류가 뜬다.

오류 출력 화면

Shutting donw VM이라고 하얀 글씨로 적혀 있는데, 이 오류가 뜨면서 어플리케이션이 종료된다. 

 

이 오류는 꽤 오래전부터 있었던 것 같다. PhotoView를 만든 chrisbanes도 readme에 이 오류에 대해 적어놓고 해결방법을 써놨다.

PhotoView 라이브러리 readme에 확인 가능하다

 

그러나 나는 아래의 해결방법으로 오류를 해결했다. 

한 화면에 다 들어오지 않아서 캡처를 못했습니다. 아래 글을 확인해주세요.

github.com/chrisbanes/PhotoView/issues/31#issuecomment-19803926

 

IllegalArgumentException (pointerIndex out of range) while using many fingers to zoom in and out · Issue #31 · chrisbanes/Phot

(Android 4.2.1 - Samsung Galaxy Nexus) java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nativeGetAxisValue(Native Method) at android.view.MotionEvent.getX(M...

github.com

이 링크에서 영문 해결방법이 확인 가능하고 내가 설명한 한글로 보고싶으면 글을 계속 읽으면 된다.

 

의외로 간단하게 해결되었다.

 

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

import androidx.viewpager.widget.ViewPager;

public class ViewPagerFixed extends ViewPager {

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

    public ViewPagerFixed(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        try {
            return super.onTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }
}

새로운 클래스를 하나 만들어준다.

onTouchEvent와 onInterceptTouchEvent로 오류가 나는 것을 방지해준다.

 

<com.example.menupan.Adapter.Frame.ViewPagerFixed
            android:id="@+id/framelayout_viewpager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

그리고 원래 사용하려고 했었던 ViewPager를 위에서 생성했던 ViewPagerFixed로 변경해준다. 

 

그러면 아무리 Zoom out을 해도 애플리케이션이 강제 종료되지 않는다. 

 

끝까지 읽어주셔서 감사합니다.

궁금한 점이나 틀린 부분이 있다면 댓글로 남겨주세요.

댓글이 달리면 저에게 알림이 와서 바로 확인할 수 있으니 최대한 빠른 시일 내에 답변 드리도록 하겠습니다.

 

반응형

+ Recent posts