Évitez de passer null comme racine de la vue (besoin de résoudre les paramètres de mise en page sur l'élément racine de la mise en page gonflée)

231

Passer null pour root studio me donne cet avertissement:

Évitez de passer null comme racine de la vue (besoin de résoudre les paramètres de mise en page sur l'élément racine de la mise en page gonflée)

Il affiche une valeur nulle dans getGroupView. Veuillez aider.

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

}
hacher
la source

Réponses:

365

Au lieu de faire

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

faire

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

Il le gonflera avec le parent donné, mais ne le joindra pas au parent.

Coeffet
la source
26
@Coeffect mais que dois-je utiliser lors du gonflage depuis l'activité? Que dois-je utiliser à la place de parent?
Alexander Kuznetsov
3
@AlexanderKuznetsov Cela dépend de ce que vous essayez de faire, je suppose. Si vous essayez de définir le contenu de l'activité, vous devez utiliser setContentView(layoutId). Si vous essayez d'ajouter une nouvelle vue à un ViewGroup existant, vous devriez probablement juste passer le parent et laisser le gonfleur attacher la nouvelle vue.
Coeffect
@LucasTan Je suppose que je garderais une référence à TabHost dans TabContentFactory et l'utiliserais comme parent lors du gonflage, mais je ne sais pas si c'est la meilleure solution. Il est étrange que la méthode createTabContent ne fournisse pas parent / contexte.
Coeffect
4
Le même problème (pas de parent) se pose lors de l'implémentation onCreateInputView()d'un InputMethodService.
Ted Hopp
3
qu'en est-il de la vue personnalisée pour alertdialog, que doit être le parent?
user25
38

Voilà, pour une raison quelconque, utiliser View.inflate au lieu de gonfler à partir d'un layoutinflater fait disparaître l'erreur de peluches. Je pensais que je publierais ceci ici car ce fil est en haut de la recherche Google ...

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

Lorsque vous n'en avez vraiment pas parent(par exemple, créer une vue pour AlertDialog), vous n'avez pas d'autre moyen que de passer null. Faites donc ceci pour éviter les avertissements:

final ViewGroup nullParent = null;
convertView = layoutInflater.inflate(R.layout.list_item, nullParent);
Mousa
la source
59
Il serait préférable de faire une suppression que d'inciter les peluches à fonctionner.
StarWind0
2
Je ne suis pas sûr que cette réponse soit correcte. J'utilise avec succès ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);my_main_contentest l'ID du conteneur le plus à l'extérieur dans le fichier de mise en page de mon activité.
ban-geoengineering
10
Pour supprimer Lint pour celui-ci, ajoutez @SuppressLint("InflateParams")au-dessus de votre méthode.
ban-geoengineering
7

Pour le AlertDialogcode ci-dessous peut être utilisé

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

Une belle information que j'ai trouvée en cherchant un moyen de résoudre ce problème. Selon Dave Smith,

L'inflation de la mise en page est le terme utilisé dans le contexte d'Android pour indiquer quand une ressource de mise en page XML est analysée et convertie en une hiérarchie d'objets View.

Le ViewGroupparamètre demandé ici dans le cadre des paramètres de la méthode de gonflement est utilisé pour hériter d'un style de niveau supérieur. En savoir plus à ce sujet ici .

Ojonugwa Jude Ochalifu
la source
0

voici une photo pour référence

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