마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

LayoutInflater가 처음 생겨나는 곳은 어디인가요?

0 추천

제 질문에 관심가져 주셔서 감사합니다. 질문들어갑니다.

private LayoutInflater mInflater;

@Override
public Object getSystemService(String name) {
    if (LAYOUT_INFLATER_SERVICE.equals(name)) {
        if (mInflater == null) {
            mInflater = LayoutInflater.from(getBaseContext()).cloneInContext(this);
        }
        return mInflater;
    }
    return getBaseContext().getSystemService(name);
}

안드로이드 에서 empty프로젝트로 프로젝트를 생성하면 보이는 것이 setContentView(@Layout int ResId)입니다.

저는 메서드가 궁금하여 파보았습니다. 즉 상속관계를 생각하며 계보를 계속 따라갔습니다.

그런데 결국 여기코드에 보이는 ContextThemeWrapper클래스에 다다랐을 때 고민에 빠졌습니다.

mInflater전역변수는 색처리된 이 세군데가 전부입니다. 이 전역변수가 초기화되려면 cloneInContext() 밖에는 없습니다. 그런데 

from(getBaseContext()).cloneInContext(this)

이것을 하면 자기의 부모클래스의 context에 붙어있는 layoutInflater를 복사하여 자기의context를 붙여줍니다.

그런데 이상한건 자기의 context는 결국 부모의 context와 동일한것 아닌가요? 그렇다면 이건

결국 같은데 떼었다 붙였다를 한것과 다를것이 없지 않습니까?

그래서 궁금해서 더 찾아보려고 하니까 cloneInContext(Context newContext)는 추상메서드였습니다.그래서 

구현클래스를 찾으려고 했지만 알길이 없습니다. 알고계신분이 있으시면 알려주시면 감사하겠습니다.

그리고 앱이 실행된 후에 LayoutInflater 인스턴스가 생겨나는 최초부분이 어디인지도 알고 싶습니다.

읽어주셔서 감사합니다.

 

stfrd10 (200 포인트) 님이 2017년 2월 13일 질문
stfrd10님이 2017년 2월 13일 수정

1개의 답변

0 추천
다른것은 몰라도 context 인스턴스에는 해당 컴포넌트의 정보도 포함하는것으로 알고 있습니다.

아마 cloneInContext 함수 이름처럼 from 함수를 호출하는 컴포넌트의 context 정보를 복제해가는것이 아닌가 생각이 됩니다.

이를 이해하려면 context는 뭐다! 라고 딱 떨어지게 설명을 드려야 하겠지만 레퍼런스를 찾아보고 구글링을 해봐도 명확하게 설명이 되어 있는곳이 없네요. 제가 잘 못찾는것일수도 있으니 한번 찾아보시길~
Development Guy (69,350 포인트) 님이 2017년 2월 13일 답변
일단은
https://www.youtube.com/watch?v=Y06wmVIFlsw
유투브를 검색한 결과 https://android.googlesource.com/platform/frameworks/base/+/android-6.0.1_r25/core/java/com/android/internal/policy/PhoneLayoutInflater.java

여기서처럼 @Hide된 내부클래스가 구현클래스인것을 알아냈습니다. 지금은 누가 이 클래스를 초기화시키는지 알아보고 있습니다.
...