Android: setContentView() == getViewInflate(). Inflate()?
Я изо всех сил стараюсь разработать умный способ вычистить груды Blah blah = (Blah) this.findViewById(R.id.blah)
в противном случае это загрязняет поле и метод onCreate() моего маленького Activity, и для этого я чувствую, что не следует использовать setContentView(), но getViewInflate().inflate() для каждого представления, определенного в XML.
Является Activity.setContentView()
Сорта синтаксис сахара, и это практически повторяется getViewInflate().inflate()
для каждого просмотра на XML? Я прочитал что-то, сказав, как будто они были одинаковыми.
Если я смогу получить ответ, заглянув в код, скажите, пожалуйста. Я проверил Activity.class, но были найдены только комментарии.
3 ответа
SetContentView в вашем Activity фактически вызывает setContentView в Window, используемом действием, который сам по себе делает гораздо больше, чем просто раздувает макет.
Что вы можете сделать, так это отобразить представления в поле класса с помощью рефлексии. Вы можете скачать служебный класс на 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);
Вы сами решаете, что вам больше подходит. Надеюсь это поможет.