Разница между двумя разными сигнатурами методов раздувания

У меня есть настроенный ArrayAdapter для спиннера в моем приложении. Вот код для его метода getDropDownView():

@Override
    public View getDropDownView(int position, View convertView,ViewGroup parent) {
        View vista = convertView;               
        if (vista==null) {
            LayoutInflater inflater =  (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vista = inflater.inflate(R.layout.row_spinner,null);
        }

        TextView tv = (TextView) vista.findViewById( R.id.textview_entry );

        if( !Utils.isSDKAbove( Utils.HONEY_COMB ) )
        {
            tv.setTextColor( getContext().getResources().getColor( android.R.color.primary_text_light ) );
        }

        tv.setText( getItem( position ) );

        return vista;
    } 

и когда tv.setText(), он генерирует исключение NullPointerException для TextView.

Тем не менее, когда я изменил

vista = inflater.inflate(R.layout.row_spinner, null);

в

vista = inflater.inflate(R.layout.row_spinner, parent, false);

оно работает.

Может кто-нибудь объяснить немного больше о разнице между двумя различными сигнатурами методов?

1 ответ

Решение

Объявляя родительское корневое представление, вы предоставляете родительский XML-макет для этого представления. Третий логический параметр затем определяет, присоединен ли этот дочерний вид к родительскому. Тем самым определяя, наследует ли child методы касания родительского представления или нет.

В любом случае представление необходимо представить в перспективе с точки зрения макета xml, чтобы настройки и структура xml, которые вы сделали, были реализованы во всей иерархии вашего представления.

Использование инфляции (layout, parent, false)Вы используете родительский макет для надувания представления (в данном случае счетчика), не прикрепляя его к родительскому представлению. Используя null, вы не предоставляете представлению никаких параметров макета, поэтому параметры макета для xml для textview не существуют.

Из документов:

root Необязательный вид, являющийся родителем сгенерированной иерархии (если attachToRoot имеет значение true), или просто объект, который предоставляет набор значений LayoutParams для корня возвращаемой иерархии (если attachToRoot имеет значение false.)

attachToRoot Должна ли завышенная иерархия быть присоединена к корневому параметру? Если false, root используется только для создания правильного подкласса LayoutParams для корневого представления в XML.

Возвращает
Корень Вид завышенной иерархии. Если указан root и attachToRoot имеет значение true, это root; в противном случае это корень завышенного XML-файла.

Использование null не является хорошим способом отсоединения представления от родительского представления, если только это не отдельная функция, например диалоговое окно оповещения.

Представление нуждается в корневом представлении, передача null иногда срабатывает, но только потому, что программа пытается создать параметры XML по умолчанию для представления.

Эта статья более подробно.

Итак, почему вы думаете, что мы получили эту ViewGroup, если мы не должны присоединяться к ней? Оказывается, родительское представление является очень важной частью процесса инфляции, потому что это необходимо для оценки LayoutParams, объявленного в корневом элементе раздуваемого XML. Не передавать ничего подобного тому, чтобы сказать структуру: "Я не знаю, к какому родителю будет присоединено это представление, извините".

Проблема заключается в том, что атрибуты android:layout_xxx всегда оцениваются в контексте родительского представления. В результате, без какого-либо известного родителя, все LayoutParams, объявленные вами в корневом элементе вашего XML-дерева, будут просто отброшены, и тогда у вас останется вопрос: "Почему фреймворк игнорирует настройки макета, которые я определил? Я бы лучше проверил SO, а затем зарегистрировал ошибку ".

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