Уникайте передачі нуля як кореня перегляду (потрібно вирішити параметри компонування на кореневому елементі надутого макета)


230

Пропуск нуля для root studio дає мені це застереження:

Уникайте передачі нуля як кореня перегляду (потрібно вирішити параметри компонування на кореневому елементі надутого макета)

Він показує нульове значення в getGroupView. Будь ласка, допоможіть.

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> _listDataChild;

    public ExpandableListAdapter(Context context, List<String> listDataHeader,
                                 HashMap<String, List<String>> listChildData) {
        super();
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);


        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

}

Відповіді:


364

Замість того, щоб робити

convertView = infalInflater.inflate(R.layout.list_item, null);

робити

convertView = infalInflater.inflate(R.layout.list_item, parent, false);

Це надує його даним батьком, але не приєднає його до батьківського.


26
@Coeffect, але що я повинен використовувати, коли надуваєте всередині діяльності? Що я повинен використовувати замість батьків?
Олександр Кузнєцов

3
@ Александр Кузнецов, я думаю, залежить від того, що ти намагаєшся робити. Якщо ви намагаєтеся встановити вміст для цієї діяльності, вам слід скористатися setContentView(layoutId). Якщо ви намагаєтеся додати новий вид у існуючий ViewGroup, вам, ймовірно, слід просто передати батьківську версію та дозволити інфлятору прикріпити новий вид.
Coeffect

@LucasTan Я думаю, я б зберігав посилання на TabHost у TabContentFactory і використовував би це як батьківський при надуванні, але я не впевнений, чи це найкраще рішення. Дивно, що метод createTabContent не забезпечує батьківський / контекст.
Coeffect

4
Ця ж проблема (немає батьків) виникає при впровадженні onCreateInputView()для InputMethodService.
Тед Хопп

2
як щодо користувацького перегляду для alardialog, яким повинен бути батько?
користувач25


38

Ось ви йдете, чомусь використання View.inflate замість того, щоб роздуватися від layoutinflater, зникає помилка ворсу. Я думав, що я опублікую це тут, оскільки ця тема знаходиться у верхній частині Пошуку Google ...

view = View.inflate(context,R.layout.custom_layout,null);

31

Коли у вас насправді немає жодного parent(наприклад, створити перегляд для AlertDialog), у вас немає іншого шляху, крім проходження null. Тому робіть це, щоб уникнути попередження:

final ViewGroup nullParent = null;
convertView = layoutInflater.inflate(R.layout.list_item, nullParent);

59
Було б краще зробити придушення, ніж обманювати втручання в роботу.
StarWind0

2
Я не впевнений, що ця відповідь правильна. Я успішно використовую, ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);де my_main_contentзнаходиться ідентифікатор самого зовнішнього контейнера у файлі макета моєї діяльності.
заборона-геоінженерія

10
Щоб придушити Лінт для цього, додайте @SuppressLint("InflateParams")вище свого методу.
заборона-геоінженерія

7

Для AlertDialogнижнього коду можна використовувати

convertView = layoutInflater.inflate(R.layout.list_item, findViewById(android.R.id.content), false);

6

Приємна інформація, яку я знайшов, шукаючи спосіб вирішити це питання. За словами Дейва Сміта,

Інфляція макета - це термін, який використовується в контексті Android для позначення, коли ресурс макета XML розбирається та перетворюється в ієрархію об'єктів View.

Тут ViewGroupбуло запропоновано, як частина параметрів методу надуття використовується для успадкування стайлінгу більш високого рівня. Хоча пропуск нуля може здатися нешкідливим, він може фактично спричинити серйозні проблеми для вашої програми згодом. Детальніше про це читайте тут .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.