Evite pasar nulo como la raíz de la vista (es necesario resolver los parámetros de diseño en el elemento raíz del diseño inflado)

231

Pasar nulo para root studio me da esta advertencia:

Evite pasar nulo como la raíz de la vista (es necesario resolver los parámetros de diseño en el elemento raíz del diseño inflado)

Muestra un valor nulo en getGroupView. Por favor ayuda.

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

}
picadillo
fuente

Respuestas:

365

En lugar de hacer

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

hacer

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

Lo inflará con el padre dado, pero no lo adjuntará al padre.

Coefecto
fuente
26
@Coeffect, pero ¿qué debo usar al inflar desde la Actividad? ¿Qué debo usar en lugar de padre?
Alexander Kuznetsov
3
@AlexanderKuznetsov Depende de lo que intentes hacer, supongo. Si está tratando de configurar el contenido para la actividad, debería estar usando setContentView(layoutId). Si está intentando agregar una nueva vista a un ViewGroup existente, probablemente debería pasar al padre y dejar que el inflador adjunte la nueva vista.
Coefecto el
@LucasTan Supongo que mantendría una referencia al TabHost en TabContentFactory y lo usaría como padre al inflar, pero no estoy seguro de si esa es la mejor solución. Es extraño que el método createTabContent no proporcione padre / contexto.
Coefecto el
44
El mismo problema (sin padre) surge cuando se implementa onCreateInputView()para un InputMethodService.
Ted Hopp
3
¿Qué pasa con la vista personalizada para el cuadro de diálogo de alerta, qué debe ser padre?
usuario25
38

Aquí tienes, por alguna razón, usar View.inflate en lugar de inflar desde un layoutinflater hace que el error de pelusa desaparezca. Pensé en publicar esto aquí ya que este hilo está en la parte superior de la Búsqueda de Google ...

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

Cuando realmente no tiene ninguna parent(por ejemplo, crear vista para AlertDialog), no tiene otra forma que pasar null. Haga esto para evitar advertencias:

final ViewGroup nullParent = null;
convertView = layoutInflater.inflate(R.layout.list_item, nullParent);
Mousa
fuente
59
Sería mejor hacer una supresión que engañar a la pelusa para que funcione.
StarWind0
2
No estoy seguro de que esta respuesta sea correcta. Estoy usando con éxito ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);donde my_main_contentestá la identificación del contenedor más externo en el archivo de diseño de mi actividad.
prohibición de geoingeniería el
10
Para suprimir Lint para este, agregue @SuppressLint("InflateParams")arriba de su método.
prohibición de geoingeniería el
7

Para el siguiente AlertDialogcódigo se puede utilizar

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

Una buena información que encontré mientras buscaba una forma de resolver esto. Según Dave Smith,

La inflación de diseño es el término utilizado en el contexto de Android para indicar cuándo se analiza un recurso de diseño XML y se convierte en una jerarquía de objetos Ver.

Lo ViewGroupsolicitado aquí como parte de los parámetros del método de inflado se utiliza para heredar un estilo de nivel superior. Si bien pasar nulo puede parecer inofensivo, en realidad puede causar serios problemas para su aplicación más adelante. Lea más sobre esto aquí .

Ojonugwa Jude Ochalifu
fuente
0

Aquí hay una imagen para referencia

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