개발 공부/문제 해결

[android] ClickableViewAccessibility 해결/2중 레이아웃 터치 문제

yong_DD 2021. 6. 17. 19:55

//JAVA 코드 작성

 

2중 레이아웃을 쓰다가 터치 되면 안되는 하단의 레이아웃의 뷰가 클릭되는 문제 발생!

(캘린더를 띄워서 날짜를 선택하는 것이었는데 날짜 선택을 여러개 해야하다보니 띄운 상태에서 다른 날짜를 클릭하면 해당 날짜가 변경되는 현상...)

 

 

[기존의 캘린더 부분 레이아웃 xml]

<FrameLayout
        android:id="@+id/PP_calendarLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#A6ECECEC"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <com.applikeysolutions.cosmocalendar.view.CalendarView
            android:id="@+id/PP_calendar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            tools:ignore="MissingConstraints" />
    </FrameLayout>

 

 

[첫 번째 시도] - 해당 뷰에 터치 리스너 달기

결과 : 반성공(동작은 된다)

오류 : 'ClickableViewAccessibility'가 뜸  performClick을 해달라는 것 같음..  (@을 달아도 그대로라서 신경쓰임)

다른 방법 검색..

 

 

 

[두 번째 시도] - performClick

@Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()){
            case MotionEvent.ACTION_UP:
                v.performClick();
                break;
        }

        return true;
    }

결과 : 실패(동작 안됨)

어떻게 해도 안되서 이 방법은 포기... 또 검색...

 

 

[세 번째 시도] - layout이 performeClick을 override 

public class BackLayoutView extends FrameLayout {
    public BackLayoutView(@NonNull Context context) {
        super(context);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                return true;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                performClick();
                return true;
        }
         return false;
    }

    @Override
    public boolean performClick() {
        super.performClick();
        return true;
    }

↓FrameLayout 변경

<com.yongdd.plantdiary.BackLayoutView
        android:id="@+id/PP_calendarLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#A6ECECEC"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

감사하게도 설명을 잘해주신 분을 찾음!

그런데..

 

결과 : 에러(NoSuchMethodException)   잉?

 

 

[네 번째 시도] - 생성자 추가

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

결과 : 성공!! 드디어 해결!

제대로 안봤던 내가 잘못이었다..😂

 

AttributeSet이 XML 문서 태그와 연관된 속성모음이라 빼놓으면 안되는 것이었다.

 

 

[전체 코드]

public class BackLayoutView extends FrameLayout {
    public BackLayoutView(@NonNull Context context) {
        super(context);
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                return true;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                performClick();
                return true;
        }
         return false;
    }

    @Override
    public boolean performClick() {
        super.performClick();
        return true;
    }
}