Android: setContentView () = = getViewInflate ().надуть ()?
Я изо всех сил стараюсь разработать умный способ очистки куч Blah blah = (Blah) this.findViewById(R.id.blah)
, которые иначе загрязняют поле и метод onCreate() моей небольшой деятельности, и для этого я чувствую, что должен использовать не setContentView (), а getViewInflate().inflate () для каждого представления, определенного в XML.
Является ли Activity.setContentView()
своего рода синтаксическим сахаром, и он практически повторяется getViewInflate().inflate()
для каждого представления XML? Я прочитал что-то, говорящее, как будто они были одним и тем же.
Если я могу получить ответ, заглянув в код, пожалуйста сказать так. Я проверил активность.класс, но были найдены только комментарии.
3 ответа:
SetContentView в вашем действии фактически вызывает setContentView в окне, используемом действием, которое само по себе делает намного больше, чем просто раздувает макет.
То, что вы можете сделать, - это сопоставить представления с полем класса с помощью reflexion. Вы можете скачать служебный класс на Github , который делает это.
Он проанализирует все представления, объявленные в макете, а затем попытается найти имя, соответствующее идентификатору в вашем R.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 в вашей деятельности.
Я публикую свои плохие исследования. Таким образом,
Activity.setContentView()
делегируетPhoneWindow.setContentView()
(единственный конкретный классWindow
), внутри которогоLayoutInflater.inflate()
называется, так сказать "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(); } } }
На самом деле вы правы, есть два способа добиться одного и того же:
1)
setContentView(R.layout.layout);
2)
Вы сами решаете, что вам больше подходит. Надеюсь, это поможет.LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.layout, null); setContentView(v);