WebView 및 JvmOverloads

6857 단어 Androidtech

@JvmOverloads 및 이로 인한 문제


안드로이드로 커스텀뷰를 만들려면 여러 구조기를 설치해야 하지만, 코틀린을 사용하면@JvmOverloads 모조를 통해 쉽게 만들 수 있다.
class MyCustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : WebView(context, attrs, defStyleAttr)
이렇게 기술하면 attrsdefStyleAttr가 없는 상황에서도 과부하 구조기가 생성된다.기본적으로 별 문제는 없지만 일부 뷰는 기대하는 행동을 하지 않을 수도 있다.
그중 하나는 Kottlin에서 custom view를 설치할 때 고려할 사항 - Qita에 적힌 것처럼 EditText입니다.defStyleAttr를 0으로 초기화하면 Context와 AttributeSet의 구조기가 지정한 기본 스타일을 받아들일 수 없고 의도적인 동작이 되지 않습니다.이런 뷰는 존재한다. 좀 오래된 기사Y.A.M의 다큐멘터리: Android Stail 노트지만 일람표가 나온다.
이런 뷰를 만났을 때 실제로 어떻게 조사했는지 비망록입니다.

원인을 조사하다


이번에 내가 만났던 View는 웹뷰인데 @JvmOverloads에 따라 기본 스타일이 적용되지 않으면 표시된 웹 페이지의 텍스트 상자를 눌러도 키보드가 표시되지 않는다.
공식은 아니지만 뜻이 있는 사람이 공개했다Android 소스 코드 검색 서비스 - Developer Collaboration Project.
public WebView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.webViewStyle);
}
웹뷰에서 위에서 정의한 바와 같이 임의의 Andoid 버전의 원본 코드webViewStyle와 같은 키워드로 검색을 시도하면 뭔가Widget.WebView가 영향을 미치는 것 같기 때문이다.
Search result for wid
진일보Widget.WebView 검색 후 다음과 같은 코드를 발견하였다.Theme에 지정focusable됐는데 설정하지 않아 키보드가 작동합니다.
<style name="Widget.WebView">
    <item name="focusable">true</item>
    <item name="focusableInTouchMode">true</item>
    <item name="scrollbars">horizontal|vertical</item>
</style>
상응하는 곳

문제 발생 View 처리


실제로 이런 View에 어떻게 접근하는지를 감안하면 3개 파라미터(또는 4개 파라미터)의 구조기를 사용할 기회가 없을 것이기 때문에 2개 파라미터@JvmOverloads를 사용하는 것이 가장 쉽다.거기서 문제가 생겼을 때 여러 구조기를 재생성하는 형식도 문제 없겠죠.

참고 자료

  • Kottlin에서 custom view를 설치할 때 고려할 사항 - Qita
  • Y.A.M의 다큐멘터리: Android Stail 노트
  • Android 소스 코드 검색 서비스 - Developer Collaboration Project
  • Do I need all three constructors for an Android custom view? - Stack Overflow
  • 좋은 웹페이지 즐겨찾기