Intereting Posts

Может ли кто-нибудь объяснить метод раздувания? Более глубокое понимание взглядов Android

Я хочу более глубокое понимание того, как работает Android, и мне нужно, чтобы кто-то объяснил, как Views действительно работают «под капотом».

В обычной процедуре мы раздували бы (это правильное слово?) Взгляды из XML в методе onCreate нашей расширенной Activity с помощью метода setContentView (R.layout.ourlayoutfile) ". Затем мы найдем Views из этого XML.

Быстрый пример: если нам нужно найти кнопку, нам нужно сначала вызвать «setContentVIew ()», а затем «findViewById» на нашей кнопке. Затем мы можем работать с этой кнопкой / view соответственно.

Я начал играть с LayoutInflater в последнее время, потому что я пришел к тому, что не смог помочь себе с методом setContentView, и, к моему удивлению, я узнал, что мои знания в Android очень хороши. Я не мог даже управлять LayoutInflater работать. Я был смущен.

Через день мне удается раздуть взгляды с помощью LayoutInflater. На самом деле это не очень сложно, я был очень близок с самого начала, но был один параметр, который я не знал, что нужно пройти. Посмотрите на этот код: (Это все происходит в методе onCreate Activity)

View v = getLayoutInflater().inflate(R.layout.activity_main, (ViewGroup) getWindow().getDecorView()); final Button b = (Button) v.findViewById(R.id.button1); final TextView tv = (TextView) v.findViewById(R.id.textView1); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tv.setText("Just random text"); } }); } 

Этот код работает нормально, но проблема, с которой я столкнулся, была на самом деле этой строкой кода:

 getLayoutInflater().inflate(R.layout.activity_main, null); 

Я всегда пропускал параметр «нуль», и, конечно, это не сработало. Даже в документации говорится, что этот параметр НЕ ДОПОЛНИТЕЛЬНО! (Почему?, Если это необходимо)?

Я сделал простой макет. Посмотрите, как это выглядит с HiearchyViewer:

Введите описание изображения здесь

Каков второй параметр на картинке выше и зачем нам это нужно? Возможно, связано мой макет (R.layout.activity_main), с представлением, представленным Android (первый вид слева направо – родительский вид). Если это так, ПОЧЕМУ не андроид не подключает эти два автоматически ?!

Введите описание изображения здесь

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

Если кто-то изменит мой вопрос, пожалуйста, объясните. Большое вам спасибо!

Solutions Collecting From Web of "Может ли кто-нибудь объяснить метод раздувания? Более глубокое понимание взглядов Android"

Посмотрите на этот код

Это довольно необычное использование LayoutInflater . В частности, я ожидаю, что это серьезно испортит ваше использование баров действий и связанных с ними «хром» вне основной области содержимого.

Я всегда пропускал параметр «нуль», и, конечно, он не работал

null – это совершенно разумное значение для второго параметра метода двухпараметрического inflate() . Это означает, что вы в какой-то момент добавите иерархию иерархического представления в свой пользовательский интерфейс (например, посредством вызова addView() для желаемого родителя).

Даже в документации говорится, что этот параметр НЕ ДОПОЛНИТЕЛЬНО!

Это связано с тем, что параметр является необязательным.

(Почему?, Если это необходимо)?

Это не нужно.

Каков второй параметр на рисунке выше

Это PhoneWindow$DecorView .

И зачем нам это нужно?

Вам это не нужно, и ваш выбор getDecorView() , по меньшей мере, является нетипичным.

Возможно, связано мой макет (R.layout.activity_main), с представлением, представленным Android (первый вид слева направо – родительский вид).

Да. Цитируя документацию , вторым параметром для двухпараметрического inflate() является «Необязательный вид, являющийся родителем сгенерированной иерархии».

Если это так, ПОЧЕМУ не андроид не подключает эти два автоматически ?!

Почему? В конце концов, есть пять общих представлений за три, которые вы раздули, как вы можете сказать, посчитав пузыри на снимке экрана «Иерархия». Почему бы это случайным образом выбрать тот, а не один из других? Кроме того, для всех Android известно, что родитель, которого вы хотите использовать, еще не существует, потому что вы его создадите на более позднем этапе.

Итак, либо передайте желаемый родитель в качестве второго параметра для inflate() (в этом случае Android добавит раздутый макет в качестве дочерних элементов для этого родителя) или передайте null (в этом случае добавление дочернего элемента в родительский элемент Ваша работа, чтобы сделать себя в какой-то подходящей точке).

Обратите внимание: если Android не будет автоматически добавлять дочерний LayoutInflater в родительский, это является нормой для двух основных применений LayoutInflater :

  • Для детей AdapterView (например, строк в ListView )
  • Для содержимого фрагментов (т. onCreateView() в onCreateView() )

Как вы уже знаете, теперь все видимые компоненты Android – это View . Это включает в себя Button , Spinner , TextView , EditText и т. Д. Вы также правы в том, как мы получаем доступ к представлениям, которые определены в XML-файле в нашей программе, путем раздувания его, а затем поиска представления с использованием его идентификатора. Обычный способ сделать это – использовать setContentView() .

Но есть этот довольно полезный класс под названием LayoutInflater который можно использовать для «раздувания» макета. Теперь рассмотрим сценарий, в котором у вас есть ListView в вашем XML-файле, который вы setContentView() с помощью setContentView() . В этом ListView вы хотите, чтобы элементы содержали ImageView и TextView . Элемент списка по умолчанию имеет только TextView . Итак, вы решили написать пользовательский адаптер, в котором вы будете использовать новый listitems.xml, в котором у вас есть TextView и ImageView . Теперь вы не можете использовать setContentView() в этом случае, поскольку он будет раздувать этот макет во всей деятельности, которая, очевидно, вам не нужна. Таким образом, вы используете LayoutInflater в этом случае, чтобы помочь вам. Вы временно раздуваете макет, используя метод inflate() . Первый аргумент принимает файл макета, который необходимо раздуть. Второй аргумент – это корень этого недавно раздутого макета. В нашем случае он может быть установлен в ListView в котором макет будет фактически завышен.

Поэтому, когда вы используете этот метод inflate() , возвращается вид, содержащий представления, находящиеся внутри завышенного xml. Теперь с этим возвращенным экземпляром представления вы можете вызвать findViewById() чтобы получить содержащиеся в нем представления, чтобы установить текст в TextView и источник изображения в ImageView .

Чаще всего, вы в конечном итоге используете LayoutInflater как его варианты использования шире, чем область обсуждения.