Evita di passare null come root della vista (devi risolvere i parametri di layout sull'elemento root del layout gonfiato)


230

Passare null per root studio mi dà questo avviso:

Evita di passare null come root della vista (devi risolvere i parametri di layout sull'elemento root del layout gonfiato)

Sta mostrando un valore nullo in getGroupView. Per favore aiuto.

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

}

Risposte:


365

Invece di farlo

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

fare

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

Lo gonferà con il genitore specificato, ma non lo collegherà al genitore.


26
@Coeffect, ma cosa devo usare quando si gonfia dall'interno dell'attività? Cosa dovrei usare al posto del genitore?
Alexander Kuznetsov,

3
@AlexanderKuznetsov Dipende da cosa stai cercando di fare, suppongo. Se stai cercando di impostare il contenuto per l'attività, dovresti utilizzare setContentView(layoutId). Se stai cercando di aggiungere una nuova vista a un ViewGroup esistente, probabilmente dovresti semplicemente passare il genitore e lasciare che il gonfiatore allega la nuova vista.
Coeffect,

@LucasTan Immagino che terrei un riferimento a TabHost in TabContentFactory e lo uso come genitore quando si gonfia, ma non sono sicuro che sia la soluzione migliore. È strano che il metodo createTabContent non fornisca padre / contesto.
Coeffetto

4
Lo stesso problema (nessun genitore) si presenta durante l'implementazione onCreateInputView()di un InputMethodService.
Ted Hopp,

2
che dire della visualizzazione personalizzata per alertdialog, cosa dovrebbe essere parent?
user25


38

Ecco qui, per qualche motivo l'uso di View.inflate invece di gonfiare da un layoutinflater fa scomparire l'errore di lanugine. Pensavo di pubblicarlo qui poiché questa discussione è in cima alla Ricerca Google ...

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

31

Quando davvero non ne hai parent(per esempio creare una vista per AlertDialog), non hai altro modo che passare null. Quindi, fai questo per evitare avvertimenti:

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

59
Sarebbe meglio fare una soppressione piuttosto che ingannare la lanugine nel lavoro.
StarWind0

2
Non sono sicuro che questa risposta sia corretta. Sto usando con successo ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);dove si my_main_contenttrova l'id del contenitore più esterno nel file di layout della mia attività.
divieto di geoingegneria il

10
Per sopprimere Lint per questo, aggiungi @SuppressLint("InflateParams")sopra il tuo metodo.
divieto di geoingegneria il

7

Per il AlertDialogcodice qui sotto può essere utilizzato

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

6

Una bella informazione che ho trovato mentre cercavo un modo per risolverlo. Secondo Dave Smith,

Inflazione del layout è il termine utilizzato nel contesto di Android per indicare quando una risorsa di layout XML viene analizzata e convertita in una gerarchia di oggetti View.

Qui è ViewGroupstato richiesto come parte dei parametri del metodo infllate per ereditare uno stile di livello superiore. Mentre passare null può sembrare innocuo, può effettivamente causare seri problemi alla tua app in seguito. Leggi di più qui .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.