Evite passar nulo como raiz da visualização (é necessário resolver os parâmetros de layout no elemento raiz do layout inflado)

230

Passar null para o root studio me dá este aviso:

Evite passar nulo como raiz da visualização (é necessário resolver os parâmetros de layout no elemento raiz do layout inflado)

Está mostrando um valor nulo em getGroupView. Por favor ajude.

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

}
cerquilha
fonte

Respostas:

364

Em vez de fazer

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

Faz

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

Ele irá inflá-lo com o pai, mas não o anexará.

Coeficiente
fonte
26
@ Coeffect, mas o que devo usar ao inflar de dentro da Atividade? O que devo usar em vez de pai?
Alexander Kuznetsov
3
@AlexanderKuznetsov Depende do que você está tentando fazer, suponho. Se você está tentando definir o conteúdo da atividade, deve estar usando setContentView(layoutId). Se você está tentando adicionar uma nova visão a um grupo de vistas existente, provavelmente deve passar o pai e deixar o inflador anexar a nova visão.
Coeffect
@LucasTan Acho que manteria uma referência ao TabHost no TabContentFactory e a usaria como pai durante o inflamento, mas não tenho certeza se essa é a melhor solução. É estranho que o método createTabContent não forneça pai / contexto.
Coeffect
4
O mesmo problema (sem pai) surge na implementação onCreateInputView()de um InputMethodService.
Ted Hopp 01/01
2
e quanto à exibição personalizada para alertdialog, o que deve ser o pai?
USER25
38

Aqui está, por algum motivo, usar View.inflate em vez de inflar a partir de um layoutinflater faz com que o erro de fiapo desapareça. Pensei em postar isso aqui, já que esse tópico está no topo da Pesquisa do Google ...

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

Quando você realmente não tem nenhuma parent(por exemplo, criando view para AlertDialog), não tem outro jeito senão passar null. Faça isso para evitar aviso:

final ViewGroup nullParent = null;
convertView = layoutInflater.inflate(R.layout.list_item, nullParent);
Mousa
fonte
59
Seria melhor fazer uma supressão do que enganar o fiapo para o trabalho.
StarWind0
2
Não tenho certeza se esta resposta está correta. Estou usando com êxito ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);onde my_main_contenté o ID do contêiner mais externo no arquivo de layout da minha atividade.
ban-geoengineering
10
Para suprimir o Lint para este, adicione @SuppressLint("InflateParams")acima do seu método.
ban-geoengineering 5/17
7

Para AlertDialogcódigo abaixo pode ser usado

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

Uma boa informação que encontrei enquanto procurava uma maneira de resolver isso.

Inflação de layout é o termo usado no contexto do Android para indicar quando um recurso de layout XML é analisado e convertido em uma hierarquia de objetos View.

O ViewGrouppedido aqui, como parte dos parâmetros do método inflar, é usado para herdar um estilo de nível superior. Embora passar nulo possa parecer inofensivo, pode causar sérios problemas ao seu aplicativo posteriormente. Leia mais sobre isso aqui .

Ojonugwa Jude Ochalifu
fonte
0

aqui está uma imagem para referência

    return inflater.inflate(R.layout.some_layout, container, true); 
//or false or even not declare
Энтони Чехов
fonte
a propósito ... import ANDROIDX.fragment.app.Fragment;
Энтони Чехов