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);

Вы сами решаете, что вам больше подходит. Надеюсь это поможет.

Другие вопросы по тегам