2012-07-11 2 views
4

Blah blah = (Blah) this.findViewById(R.id.blah) 더미를 지우는 영리한 방법을 개발하기 위해 열심히 노력합니다. 그렇지 않으면 필드와 내 작은 Activity의 onCreate() 메소드를 오염 시키므로 그렇게하기 위해 setContentView()를 사용하지 말고 getViewInflate) .inflate() XML로 정의 된 모든보기.Android : setContentView() == getViewInflate(). inflate()?

Activity.setContentView()은 신디사이저 설탕이며 모든 XML보기에서 실질적으로 getViewInflate().inflate()을 반복하고 있습니까? 나는 마치 그들이 똑같은 말을 읽었다.

코드를 살펴보면 답변을 얻을 수 있습니다. Activity.class를 확인했지만 주석 만 발견되었습니다.

1) setContentView(R.layout.layout);

2)

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View v = inflater.inflate(R.layout.layout, null); 
setContentView(v); 

당신은 당신을 위해 더 적절할지 결정 :

+1

이'getViewInflate()'메소드는 어디에 있습니까? http://developer.android.com/reference/android/app/Activity.html에서 볼 수 없습니다. – fiddler

+0

죄송합니다. 'ViewInflate.inflate()'여야합니다. – Quv

답변

2

액티비티의 setContentView는 실제로 액티비티가 사용하는 윈도우에서 setContentView를 호출하는데, 그 자체로 레이아웃을 부 풀리는 것 이상의 의미가있다.

당신이 할 수있는 일은 reflexion을 사용하여 뷰를 클래스 필드에 매핑하는 것입니다. 이 작업을 수행하는 유틸리티 클래스 on Github을 다운로드 할 수 있습니다.

레이아웃에서 선언 된 모든 뷰를 구문 분석 한 다음 R.id 클래스의 ID에 해당하는 이름을 찾으려고합니다. 그런 다음 대상 개체에서 동일한 이름의 필드를 찾아 해당보기로 설정하려고 시도합니다. 이

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
</LinearLayout> 

같은 레이아웃이있는 경우 예를 들어

, 자동으로 활동에 textView1 필드에 매핑됩니다.

+0

고마워. 그들은 정말로 흥미 롭습니다. 나에게있어서 한 가지 문제는 그 성능이다. 아마도 'android.R.id.content'의'ViewGroup'에 속한 모든'View '를 검색하는 메소드를 호출했기 때문일 것이다. 아마도'setContentView()'를 사용하지 않고 내 자신의 메소드를 정의 할 것이므로'ViewInflate.inflate()'가 실행될 때마다 변수에'View'를 할당 할 수 있습니다. – Quv

-1

은 실제로 당신 말이 맞아, 같은 일을 달성하기 위해 두 가지 방법이있다. 희망이 도움이됩니다.

+0

정말 모호한 질문에 사과드립니다. 필자는'setContentView()'메소드의 정의에서'ViewInflate.inflate()'가 실제로 사용 된 것으로 알고 그 사실을 알고 싶다고 생각했습니다. 나는 내 질문에 대해 더 자세히 설명해야 할까 ... – Quv

0

나는 가난한 연구를 게시하고 있습니다. 요약하면 Activity.setContentView() 이 호출되는 PhoneWindow.setContentView() (콘크리트 클래스는 Window)이므로 "setContentView() == ViewInflate().inflate()"은 지나치게 벗어난 것이 아닙니다.

public class Activity extends { 

    private Window mWindow; 

    public void setContentView(int layoutResID) { 
     getWindow().setContentView(layoutResID); 
     initActionBar(); 
    } 

    public Window getWindow() { 
     return mWindow; 
    } 
} 



public class PhoneWindow extends Window { 

    private LayoutInflater mLayoutInflater; 

    @Override 
    public void setContentView(int layoutResID) { 
     if (mContentParent == null) { 
      installDecor(); 
     } else { 
      mContentParent.removeAllViews(); 
     } 
     **mLayoutInflater.inflate(layoutResID, mContentParent);** 
     final Callback cb = getCallback(); 
     if (cb != null) { 
      cb.onContentChanged(); 
     } 
    } 
}