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の間の2番目の使用ですか?どんな状況で私はどちらかを選ぶべきですか?

答えて

22

setContentViewは、Activity方法のみです。各Activityには、IDが"@+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'を使うことはできません。 –

関連する問題