Unikaj przekazywania wartości null jako katalogu głównego widoku (musisz rozwiązać parametry układu w elemencie głównym zawyżonego układu)

230

Podanie wartości null dla studia root daje mi to ostrzeżenie:

Unikaj przekazywania wartości null jako katalogu głównego widoku (musisz rozwiązać parametry układu w elemencie głównym zawyżonego układu)

Pokazuje wartość null w getGroupView. Proszę pomóż.

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

}
haszysz
źródło

Odpowiedzi:

364

Zamiast robić

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

robić

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

Nadmucha go z danym rodzicem, ale nie przywiąże go do rodzica.

Współczynnik
źródło
26
@Coefekt, ale czego powinienem użyć, gdy napompuję z działania? Czego powinienem używać zamiast rodzica?
Alexander Kuznetsov
3
@AlexanderKuznetsov Zależy od tego, co próbujesz zrobić. Jeśli próbujesz ustawić zawartość działania, powinieneś użyć setContentView(layoutId). Jeśli próbujesz dodać nowy widok do istniejącej grupy ViewGroup, prawdopodobnie powinieneś po prostu przekazać rodzica i pozwolić inflatorowi dołączyć nowy widok.
Współefekt
@LucasTan Chyba trzymałbym odniesienie do TabHost w TabContentFactory i używałbym tego jako elementu nadrzędnego podczas pompowania, ale nie jestem pewien, czy to najlepsze rozwiązanie. Dziwne, że metoda createTabContent nie dostarcza elementu nadrzędnego / kontekstu.
Współefekt
4
Ten sam problem (brak onCreateInputView()elementu nadrzędnego) pojawia się podczas wdrażania dla InputMethodService.
Ted Hopp
2
co z niestandardowym widokiem dla alertdialog, jaki powinien być rodzic?
user25
38

Proszę bardzo, z jakiegoś powodu użycie View.inflate zamiast nadmuchiwania z layoutinflater powoduje zniknięcie błędu strzępienia. Myślałem, że opublikuję to tutaj, ponieważ ten wątek znajduje się na górze wyszukiwarki Google ...

view = View.inflate(context,R.layout.custom_layout,null);
Piorun
źródło
31

Kiedy tak naprawdę nie masz żadnego parent(na przykład tworzenia widoku dla AlertDialog), nie masz innego wyjścia niż przejście null. Zrób to, aby uniknąć ostrzeżenia:

final ViewGroup nullParent = null;
convertView = layoutInflater.inflate(R.layout.list_item, nullParent);
Mousa
źródło
59
Lepiej byłoby zrobić tłumienie niż nakłonić kłaczki do działania.
StarWind0
2
Nie jestem pewien, czy ta odpowiedź jest poprawna. Z powodzeniem używam ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);gdzie my_main_contentjest identyfikator najbardziej zewnętrznego kontenera w pliku układu mojej aktywności.
zakaz geoinżynierii
10
Aby stłumić Lint dla tego, dodaj @SuppressLint("InflateParams")powyżej swojej metody.
zakaz geoinżynierii
7

Do AlertDialogponiższego kodu można użyć

convertView = layoutInflater.inflate(R.layout.list_item, findViewById(android.R.id.content), false);
Mostafa Monowar
źródło
6

Przyjemna informacja, którą znalazłem, szukając sposobu na rozwiązanie tego problemu. Według Dave'a Smitha,

Inflacja układu to termin używany w kontekście systemu Android w celu wskazania, kiedy zasób układu XML jest analizowany i konwertowany na hierarchię obiektów widoku.

ViewGroupZostały poproszone o tutaj jako część nadmuchać parametrów metoda jest stosowana do dziedziczenia wyższy poziom styling.While przechodzącą NULL może wydawać się nieszkodliwe, to rzeczywiście może być przyczyną poważnych problemów dla aplikacji później. Przeczytaj więcej na ten temat tutaj .

Ojonugwa Jude Ochalifu
źródło