Hindari melewatkan null sebagai view root (harus menyelesaikan parameter tata letak pada elemen root tata letak yang meningkat)


230

Melewati nol untuk root studio memberi saya peringatan ini:

Hindari melewatkan null sebagai view root (harus menyelesaikan parameter tata letak pada elemen root tata letak yang meningkat)

Ini menunjukkan nilai null dalam getGroupView. Tolong bantu.

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

}

Jawaban:


364

Alih-alih melakukan

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

melakukan

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

Itu akan mengembang dengan orang tua yang diberikan, tetapi tidak akan melampirkannya ke orang tua.


26
@Coffect tetapi apa yang harus saya gunakan saat menggembung dari dalam Aktivitas? Apa yang harus saya gunakan daripada orangtua?
Alexander Kuznetsov

3
@AlexanderKuznetsov Tergantung apa yang Anda coba lakukan, saya kira. Jika Anda mencoba mengatur konten untuk aktivitas, Anda harus menggunakan setContentView(layoutId). Jika Anda mencoba untuk menambahkan tampilan baru ke ViewGroup yang ada, Anda mungkin harus melewati orang tua dan membiarkan inflater melampirkan tampilan baru.
Coeffect

@LucasTan Saya kira saya akan menyimpan referensi ke TabHost di TabContentFactory dan menggunakannya sebagai induk ketika menggembungkan, tapi saya tidak yakin apakah itu solusi terbaik. Sungguh aneh bahwa metode createTabContent tidak menyediakan induk / konteks.
Koefisien

4
Masalah yang sama (tidak ada orangtua) muncul saat menerapkan onCreateInputView()untuk InputMethodService.
Ted Hopp

2
bagaimana dengan tampilan khusus untuk alertdialog, seperti apa seharusnya orangtua?
pengguna25


38

Ini dia, untuk beberapa alasan menggunakan View.inflate alih-alih menggembung dari layoutinflater membuat kesalahan serat menghilang. Kupikir aku akan memposting ini di sini karena utas ini ada di bagian atas Google Search ...

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

31

Ketika Anda benar-benar tidak memiliki parent(misalnya membuat tampilan untuk AlertDialog), Anda tidak memiliki cara lain selain melewati null. Jadi lakukan ini untuk menghindari peringatan:

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

59
Akan lebih baik untuk melakukan penindasan daripada menipu serat agar bekerja.
StarWind0

2
Saya tidak yakin jawaban ini benar. Saya berhasil menggunakan di ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);mana my_main_contentid wadah terluar dalam file tata letak aktivitas saya.
larangan geoengineering

10
Untuk menekan Lint untuk yang ini, tambahkan @SuppressLint("InflateParams")metode Anda di atas.
larangan geoengineering

7

Untuk AlertDialogkode di bawah ini dapat digunakan

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

6

Informasi bagus yang saya temukan saat mencari cara untuk menyelesaikan ini. Menurut Dave Smith,

Layout inflation adalah istilah yang digunakan dalam konteks Android untuk menunjukkan kapan sumber daya tata letak XML diuraikan dan dikonversi menjadi hierarki objek Tampilan.

Yang ViewGroupdiminta di sini sebagai bagian dari parameter metode mengembang digunakan untuk mewarisi styling tingkat yang lebih tinggi. Meskipun melewati nol bisa tampak tidak berbahaya, itu sebenarnya dapat menyebabkan masalah serius untuk aplikasi Anda nanti. Baca lebih lanjut tentang ini di sini .


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.