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

}
hash
sumber

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.

Koefisien
sumber
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);
Petir
sumber
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);
Mousa
sumber
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);
Mostafa Monowar
sumber
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 .

Ojonugwa Jude Ochalifu
sumber
0

di sini adalah gambar untuk referensi

    return inflater.inflate(R.layout.some_layout, container, true); 
//or false or even not declare
Энтони Чехов
sumber
omong-omong ... impor ANDROIDX.fragment.app.Fragment;
Энтони Чехов