Vermeiden Sie es, null als Ansichtsstamm zu übergeben (Layoutparameter müssen im Stammelement des aufgeblasenen Layouts aufgelöst werden).

229

Wenn ich null für root studio übergebe, erhalte ich folgende Warnung:

Vermeiden Sie es, null als Ansichtsstamm zu übergeben (Layoutparameter müssen im Stammelement des aufgeblasenen Layouts aufgelöst werden).

Es wird ein Nullwert in angezeigt getGroupView. Bitte helfen Sie.

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

}
Hash
quelle

Antworten:

363

Anstatt zu tun

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

machen

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

Es wird mit dem angegebenen Elternteil aufgeblasen, aber nicht mit dem Elternteil verbunden.

Koeffizient
quelle
26
@Coeffect, aber was soll ich beim Aufblasen innerhalb der Aktivität verwenden? Was soll ich anstelle der Eltern verwenden?
Alexander Kuznetsov
3
@AlexanderKuznetsov Kommt darauf an, was du versuchst, nehme ich an. Wenn Sie versuchen, den Inhalt für die Aktivität festzulegen, sollten Sie verwenden setContentView(layoutId). Wenn Sie versuchen, einer vorhandenen ViewGroup eine neue Ansicht hinzuzufügen, sollten Sie wahrscheinlich nur das übergeordnete Element übergeben und den Inflater die neue Ansicht anhängen lassen.
Koeffekt
@LucasTan Ich denke, ich würde einen Verweis auf den TabHost in der TabContentFactory behalten und diesen als übergeordnetes Element beim Aufblasen verwenden, aber ich bin mir nicht sicher, ob dies die beste Lösung ist. Es ist seltsam, dass die Methode createTabContent kein übergeordnetes Element / keinen Kontext bereitstellt.
Koeffekt
4
Das gleiche Problem (kein übergeordnetes Element) tritt bei der Implementierung onCreateInputView()für ein InputMethodService.
Ted Hopp
2
Was ist mit der benutzerdefinierten Ansicht für alertdialog? Was sollte ein Elternteil sein?
Benutzer25
38

Aus irgendeinem Grund lässt View.inflate den Flusenfehler verschwinden, wenn Sie View.inflate verwenden, anstatt ihn aus einem Layoutinflater aufzublasen. Ich dachte, ich würde das hier posten, da dieser Thread oben in der Google-Suche steht ...

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

Wenn Sie wirklich keine haben parent(zum Beispiel eine Ansicht für erstellen AlertDialog), haben Sie keine andere Möglichkeit als zu übergeben null. Tun Sie dies, um eine Warnung zu vermeiden:

final ViewGroup nullParent = null;
convertView = layoutInflater.inflate(R.layout.list_item, nullParent);
Mousa
quelle
59
Es wäre besser, eine Unterdrückung durchzuführen, als Flusen zum Arbeiten zu verleiten.
StarWind0
2
Ich bin mir nicht sicher, ob diese Antwort richtig ist. Ich verwende erfolgreich, ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);wo my_main_contentsich die ID des äußersten Containers in der Layoutdatei meiner Aktivität befindet.
Ban-Geoengineering
10
Fügen Sie @SuppressLint("InflateParams")oben Ihre Methode hinzu, um Lint für diesen zu unterdrücken .
Ban-Geoengineering
7

Für den folgenden AlertDialogCode kann Code verwendet werden

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

Eine nette Information, die ich gefunden habe, als ich nach einer Möglichkeit gesucht habe, dies zu lösen. Laut Dave Smith,

Layout Inflation ist der Begriff, der im Kontext von Android verwendet wird, um anzugeben, wann eine XML-Layoutressource analysiert und in eine Hierarchie von Ansichtsobjekten konvertiert wird.

Die ViewGrouphier als Teil der Inflate-Methode angeforderten Parameter werden verwendet, um das Styling auf höherer Ebene zu erben. Während das Übergeben von null harmlos erscheint, kann es später tatsächlich zu ernsthaften Problemen für Ihre App führen. Lesen Sie mehr dazu hier .

Ojonugwa Jude Ochalifu
quelle
0

Hier ist ein Bild als Referenz

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