18

여러 조각으로 탭 목록을 만들고 있습니다. 주 활동에서 setContentView을 사용하여 xml 레이아웃을 얻은 다음 findViewById을 사용하여 해당 UI 요소 구성을 가져 왔음을 확인했습니다.setContentView와 LayoutInflater의 차이점

setContentView(R.layout.fragment_tabs); 
mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
mTabHost.setup(); 
mTabManager = new TabManager(this, mTabHost, android.R.id.tabcontent); 

그러나 다른 조각 클래스에서는 풍선을 대신 사용해야합니다.

View v = inflater.inflate(R.layout.webview, container, false); 
WebView myBrowser=(WebView)v.findViewById(R.id.mybrowser); 

그리고 두 가지 기능을 사용하여 개체를 만드는 레이아웃 XML을 가져 오는 데 사용되는 이유는 무엇입니까? onCreate 동안 첫 번째 사용이고 onCreateView 동안 두 번째 사용 하나입니까? 어떤 상황에서 나는 그들 중 하나를 선택해야합니까?

답변

22

setContentViewActivity 방법입니다. 각 Activity에는 "@+id/content"FrameLayout (콘텐츠보기)이 제공됩니다. setContentView에 지정하는보기는 모두 Activity의보기가됩니다. 보기의 인스턴스를이 메소드에 전달할 수도 있습니다 (예 : setContentView(new WebView(this)); 사용중인 방법의 버전에 따라 화면이 뒤쪽으로 펼쳐집니다.

조각에는 조각이있는 경우보기를 반환하는 onCreateView이라는 라이프 사이클 메서드가 있습니다. 이렇게하는 가장 일반적인 방법은 XML로 뷰를 확장하고이 메서드에서 반환하는 것입니다. 이 경우에는 스스로 팽창시켜야합니다. 조각에 setContentView 메서드가 없습니다.

+0

응답 해 주셔서 감사합니다. 또한 findViewById가 실행되기 전에 xml 파일을 가져 와서 개체를 만들어야합니까? 나는 공식 문서에서 몇 가지 예를 발견 했으므로 그렇지 않다. 예 : EditText editText = (EditText) findViewById (R.id.email_address); – user782104

+4

나는이 질문을 완전히 이해할 수 있을지 모르겠다. 내 대답이 이해가되지 않는다면, 다시 물어 보자. 액티비티와 뷰에는 모두 findViewById()라는 메서드가 있습니다. 액티비티 버전은 컨텐트 뷰 내에서 주어진 id를 가진 뷰를 검색 할 것입니다 (따라서 내부적으로 contentView.findViewById()를 호출 할 것입니다). 즉, contentView를 사용하기 전에 설정해야합니다. "setContentView"와 마찬가지로 조각에는 "findViewById"(내용보기가 없기 때문에 의미가 있습니다) 메서드가 없습니다. 대신에 getView(). findViewById()를 사용하면됩니다. –

+0

당신은'setContentView'에 대한 대안으로 액티비티에서'LayoutInflater.inflate'를 사용할 수 있다고 언급하지 않았습니다. –