[android] findViewById의 결과를 캐스트 할 필요가 없습니까?

최근에 AndroidStudio가 클래스 캐스트를 제거하도록 상기시키는 것을 발견했습니다. 예전에는 findViewById의 결과를 캐스트해야하지만 이제는 필요하지 않습니다.

findViewById의 결과는 여전히 View이므로 클래스를 캐스팅 할 필요가없는 이유를 알고 싶습니다.

언급 된 문서를 찾을 수 없습니다. 누구든지 문서를 찾을 수 있습니까?



답변

API 26부터는 findViewById리턴 유형에 추론을 사용하므로 더 이상 캐스트 할 필요가 없습니다.

오래된 정의 :

View findViewById(int id)

새로운 정의 :

<T extends View> T findViewById(int id)

따라서 귀하의 compileSdk26 세 이상인 경우, 귀하 가 이것을 사용할 수 있음을 의미합니다. 🙂


답변

기사 에 따르면 :

다음 함수는 수동 캐스팅이 필요하지 않도록 Java의 generics 자동 유형 유추에 의존합니다.

protected <T extends View> T findViewById(@IdRes int id) {
    return (T) getRootView().findViewById(id);
}


답변

이전 버전에서 :

AutoCompleteTextView name = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);

SDK 26이 설치된 Android Studio 3.0에서 :

AutoCompleteTextView name = findViewById(R.id.autoCompleteTextView);


답변

Android Studio 는 가시성 또는 onClick () 과 같은 일반적인 메소드 와 같은 View 클래스 에서 공통 속성을 사용하는 경우 캐스팅을 제거하도록 상기시킵니다

예를 들면 다음과 같습니다.

((ImageView) findViewById(R.id.image_car)).setVisibility(View.VISIBLE);

이 경우 간단히 다음과 같이 쓸 수 있습니다.

findViewById(R.id.image_car).setVisibility(View.VISIBLE);


답변

안드로이드 0, 캐스팅 정리

구글이 IO 2017에서 발표하는 것 중 하나는 ‘캐스트 어웨이’입니다. 🙂 Android 개발자는 findViewById ()를 위해 수동 캐스팅을 수행 할 필요가 없습니다. 예를 들어 findViewById ()를 사용하여 텍스트보기를 얻는 오래된 방법은 다음과 같습니다.

TextView txtDesc = (TextView) findViewById(R.id.textViewDesc);
txtDesc.setText(getString(R.string.info_angkot_description));

새로운 방법은 이렇습니다

TextView txtDesc = findViewById(R.id.textViewDesc);
txtDesc.setText(getString(R.string.info_angkot_description));

간단한 변화입니다. 그러나 노련한 프로그래머의 경우 이와 같은 깨끗한 코드를 사용하면 매우 행복하고 코딩 분위기에 도움이 될 수 있습니다. 🙂

이를 위해서는 app build.gradle에서 프로젝트 컴파일 sdk 버전을 버전 26으로 설정하기 만하면됩니다.

이전 SDK 버전도 계속 타겟팅 할 수 있으므로 방해가되지 않는 변경 사항입니다.

이제 진짜 문제는, 이번에 캐스팅을 사용하는 오래된 코드를 어떻게 정리합니까? 특히 수백 개의 활동 파일이있는 경우. 수동으로 할 수도 있고 인턴을 고용하여 할 수도 있습니다. 그러나 운 좋게도 모든 인턴 인 안드로이드 스튜디오는 이미 우리를 도울 준비를했습니다.

캐럿을 넣거나 중복 캐스팅을 클릭하면 android studio에서 중복 캐스팅을 처리하는 두 가지 옵션을 제안합니다.

먼저 중복 캐스트를 제거하거나 정리 코드를 선택할 수 있습니다. 해당 파일에 대한 모든 중복 캐스트를 제거합니다. 이것은 더 좋지만 더 많이 원합니다. 우리는 각 파일을 열고 싶지 않아 하나씩 정리합니다.

IntelliJ idea를 특별하게 만드는 것 중 하나는 인 텐트 액션이라는 기능입니다. ctrl + shift + A를 누른 다음 clean을 입력하기 만하면됩니다. 코드 정리 조치를 선택하고 전체 프로젝트 범위를 선택하십시오. 이 몇 가지 간단한 단계만으로 코드가 훨씬 깨끗해집니다.

한 가지 중요한 점은 일부 코드 버전 관리 시스템에서이 작업을 수행한다는 것입니다. 이렇게하면 의도 조치에 의해 수행 된 변경 사항을 비교하고 원하는 파일을 되돌릴 수 있습니다.

원본 게시물에서 복사 :

https://medium.com/@abangkis/android-0-clean-up-casting-c30acec56cef


답변

의 소스 코드 ViewGroup에는 반환 인수의 캐스트가 있습니다. 따라서 다시 캐스팅 할 필요가 없습니다.

@Nullable
public final <T extends View> T findViewById(@IdRes int id) {
    if (id == NO_ID) {
        return null;
    }
    return findViewTraversal(id);
}

@Override
protected <T extends View> T findViewTraversal(@IdRes int id) {
    if (id == mID) {
        return (T) this;  //###### cast to T
    }

    final View[] where = mChildren;
    final int len = mChildrenCount;

    for (int i = 0; i < len; i++) {
        View v = where[i];

        if ((v.mPrivateFlags & PFLAG_IS_ROOT_NAMESPACE) == 0) {
            v = v.findViewById(id);

            if (v != null) {
                return (T) v; //###### cast to T
            }
        }
    }

    return null;
}


답변