@Saymon_K

Андроид: LayoutInflater — зачем он нужен?

Добрый день!
Начал изучать Андроид и вот дошел до темы про LayoutInflater. Сколько я не искал разъяснений в Google Search и в книжках разных писателей, все никак не получилось понять: что это за штука? И почему бы не использовать вместо нее более короткий findViewById? Ведь они оба берут элемент (какое-либо View) из xml файла с целью работы в коде.
  • Вопрос задан
  • 12079 просмотров
Решения вопроса 1
Collosteam
@Collosteam
Android кодирую
Класс LayoutInflater содержит метод:
public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
        if (DEBUG) System.out.println("INFLATING from resource: " + resource);
        XmlResourceParser parser = getContext().getResources().getLayout(resource);
        try {
            return inflate(parser, root, attachToRoot);
        } finally {
            parser.close();
        }
    }

Соответственно парсер парсит xml и преобразует в объект класса View;

Когда вы в Activity указываете setContentView(int id);
Вы передаете ссылку на xml. Внутри Activity находится экземпляр класса Window, он парсит ваш xml и получает объект класса View. Дальше при вызове в Activity - findViewById(int id), вы обращаетесь к экземпляру класса Window, в свою очередь он делегирует (передает вызов) экземпляру класса View.
А класс View содержит метод findViewById(int id), и уже он возвращает искомый объект, соответственно в обоих случаях механизм один и тот же, только LayoutInflater обычно используется для парсинга xml не являющихся layout Activity. Например при отрисовке Fragments и CustomView или при компоновке Activity из Java.

Посмотрите исходники SDK, там очень подробно все описано.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@bimeg
findViewById не работает с xml. Он работает с деревом Viewшек. А вот чтобы это дерево сделать из xml как раз нужен LayoutInflater.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы