Tránh truyền null làm gốc xem (cần giải quyết các tham số bố cục trên phần tử gốc của bố cục bị thổi phồng)


230

Truyền null cho studio gốc cho tôi cảnh báo này:

Tránh truyền null làm gốc xem (cần giải quyết các tham số bố cục trên phần tử gốc của bố cục bị thổi phồng)

Nó đang hiển thị một giá trị null trong getGroupView. Xin vui lòng giúp đỡ.

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

}

Câu trả lời:


364

Thay vì làm

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

làm

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

Nó sẽ thổi phồng nó với cha mẹ đã cho, nhưng sẽ không gắn nó với cha mẹ.


26
@Coeffect nhưng tôi nên sử dụng gì khi lạm phát từ bên trong Hoạt động? Tôi nên sử dụng gì thay vì cha mẹ?
Alexander Kuznetsov

3
@AlexanderKuznetsov Phụ thuộc vào những gì bạn đang cố gắng làm, tôi cho rằng. Nếu bạn đang cố gắng đặt nội dung cho hoạt động, bạn nên sử dụng setContentView(layoutId). Nếu bạn đang cố gắng thêm chế độ xem mới vào Viewgroup hiện tại, có lẽ bạn chỉ cần vượt qua phụ huynh và để cho bộ lọc đính kèm chế độ xem mới.
Coeffect

@LucasTan Tôi đoán tôi sẽ giữ một tham chiếu đến Tabhost trong TabContentFactory và sử dụng nó làm cha mẹ khi lạm phát, nhưng tôi không chắc đó có phải là giải pháp tốt nhất không. Điều kỳ lạ là phương thức createTabContent không cung cấp cha / bối cảnh.
Coeffect

4
Vấn đề tương tự (không có cha mẹ) xuất hiện khi thực hiện onCreateInputView()cho một InputMethodService.
Ted Hopp

2
Còn về chế độ xem tùy chỉnh cho alertdialog, cha mẹ nên là gì?
dùng25


38

Ở đây ya đi, vì một số lý do sử dụng View.inflate thay vì thổi phồng từ layoutinflater làm cho lỗi lint biến mất. Tôi nghĩ rằng tôi sẽ đăng bài này ở đây vì chủ đề này nằm ở đầu Tìm kiếm của Google ...

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

31

Khi bạn thực sự không có bất kỳ parent(ví dụ: tạo chế độ xem cho AlertDialog), bạn không có cách nào khác ngoài việc vượt qua null. Vì vậy, làm điều này để tránh cảnh báo:

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

59
Nó sẽ tốt hơn để làm một sự đàn áp hơn là lừa lint làm việc.
StarWind0

2
Tôi không chắc câu trả lời này là đúng. Tôi đang sử dụng thành công ViewGroup root = (ViewGroup) myActivity.findViewById(R.id.my_main_content);ở đâu my_main_contentlà Id của vùng chứa ngoài cùng trong file bố trí hoạt động của tôi.
ban-geengineering

10
Để triệt tiêu Lint cho cái này, hãy thêm @SuppressLint("InflateParams")vào phương thức của bạn.
ban-geengineering

7

Đối với AlertDialogmã dưới đây có thể được sử dụng

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

6

Một thông tin hay mà tôi tìm thấy trong khi tìm cách giải quyết vấn đề này. Theo Dave Smith,

Lạm phát bố cục là thuật ngữ được sử dụng trong ngữ cảnh của Android để chỉ thời điểm tài nguyên bố cục XML được phân tích cú pháp và chuyển đổi thành hệ thống phân cấp của các đối tượng Xem.

Việc ViewGroupđược yêu cầu ở đây là một phần của các tham số phương thức lạm phát được sử dụng để kế thừa kiểu dáng mức cao hơn. Khi chuyển null có vẻ vô hại, nó thực sự có thể gây ra sự cố nghiêm trọng cho ứng dụng của bạn sau này. Tìm hiểu thêm về điều này ở đây .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.