Android: setContentView () = = getViewInflate ().надуть ()?


Я изо всех сил стараюсь разработать умный способ очистки куч Blah blah = (Blah) this.findViewById(R.id.blah), которые иначе загрязняют поле и метод onCreate() моей небольшой деятельности, и для этого я чувствую, что должен использовать не setContentView (), а getViewInflate().inflate () для каждого представления, определенного в XML.

Является ли Activity.setContentView() своего рода синтаксическим сахаром, и он практически повторяется getViewInflate().inflate() для каждого представления XML? Я прочитал что-то, говорящее, как будто они были одним и тем же.

Если я могу получить ответ, заглянув в код, пожалуйста сказать так. Я проверил активность.класс, но были найдены только комментарии.

3 4

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);
Вы сами решаете, что вам больше подходит. Надеюсь, это поможет.