Tránh sử dụng null làm cảnh báo root root khi xem cảnh báo để sử dụng bởi AlertDialog


126

Tôi nhận được cảnh báo lint, Avoid passing null as the view rootkhi lạm phát quan điểm với nullnhư parent, như:

LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);

Tuy nhiên, chế độ xem được sử dụng làm nội dung của một AlertDialog, sử dụng setViewtrên AlertDialog.Builder, vì vậy tôi không biết những gì nên được thông qua như là parent.

Bạn nghĩ gì parentnên có trong trường hợp này?


2
Vượt qua sai thay vì null. xem cái này
MrDumb

Cố gắng cung cấp cho bạn bố cục cha mẹ thay vì null và sau đó không sử dụng setView.
Haresh Chhelana

Tôi ngăn chặn cảnh báo lint cho phương pháp. Tôi chưa thấy một lý do tốt tại sao tôi không nên vượt qua null.
323go

4
Tôi hiểu vấn đề bố cục tùy thuộc vào chế độ xem chính, nhưng điều đó không thực sự áp dụng cho AlertDialog, về cơ bản nổi trên hệ thống phân cấp chế độ xem của Hoạt động. Đó là lý do tại sao bạn có thể vượt qua null. Có một lý do mà bạn có thể ngăn chặn xơ vải. Lint có nhiệm vụ đưa ra cảnh báo cho bạn về các vấn đề thường bị bỏ lỡ; trong trường hợp này, đó là lời mời chính xác.
323go

1
@ ashutiwari4 Tôi đang học những điều mới mỗi ngày .. thế giới tươi đẹp: Tôi
Rahul

Câu trả lời:


174

Sử dụng mã này để tăng cường xem hộp thoại mà không có cảnh báo:

View.inflate(context, R.layout.dialog_edit, null);

7
@ MarianPaździoch Bởi vì nó không gây ra cảnh báo. :-) Tất nhiên, điều đó đặt ra câu hỏi tại sao mã lint xử lý View.inflateLayoutInflator.inflatekhác nhau. Tôi chưa thấy câu trả lời dứt khoát. Nó có thể liên quan đến lý do tại sao có hai cách dường như tương đương để làm tăng cùng một quan điểm, mà tôi cũng không thấy một lý do hợp lý.
Edward Brey

12
Cái này sai. Nó chỉ ngăn chặn cảnh báo, nhưng vấn đề vẫn còn đó. Đọc possiblemobile.com/2013/05/layout-inflation-as-intends để có giải pháp tốt hơn.
jcsahnwaldt phục hồi lại

16
@JonaChristopherSahnwaldt Bạn có thể giải thích? Bài báo nói rằng AlertDialog nên có cha mẹ null vì nó không có chế độ xem gốc. Đối với tôi dường như củng cố rằng cảnh báo có ý nghĩa đối với các chế độ xem bên ngoài hộp thoại nhưng không áp dụng cho chế độ xem hộp thoại.
Edward Brey

7
@EdwardBrey Bạn nói đúng - Tôi đã không đọc kỹ bài viết. Trong trường hợp cụ thể này, bạn có thể sử dụng một trong hai View.inflate(...null)hoặc @SuppressLint. Nói chung, LayoutInflater.from(...).inflate(..., parent, false)là tốt hơn. Cảm ơn đã chỉ ra điều này!
jcsahnwaldt phục hồi lại

1
@Bevor Điều đó Tránh vượt qua câu hỏi null là về các trường hợp bạn có cha mẹ. Câu hỏi này là về AlertDialog, cung cấp không có phụ huynh cho quan điểm bị thổi phồng. Khi thổi phồng khung nhìn gốc của an AlertDialog, truyền null là chính xác. Lint không tính đến bối cảnh cụ thể này, vì vậy cảnh báo mà nó đưa ra nếu bạn sử dụng chức năng có parentkết quả dương tính giả, không phải là dấu hiệu của bất kỳ lỗi nào. Đó là lý do tại sao trong trường hợp này sử dụng chức năng không có parentvà không kích hoạt cảnh báo.
Edward Brey

35

Câu chuyện ngắn là khi bạn đang thổi phồng một khung nhìn cho một hộp thoại, parentsẽ không có giá trị, vì nó không được biết tại View lạm phát. Trong trường hợp này, bạn có ba giải pháp cơ bản để tránh cảnh báo:

  1. Bỏ qua cảnh báo bằng @Suppress
  2. Thổi phồng khung nhìn bằng phương pháp lạm phát của View . Đây chỉ là một trình bao bọc xung quanh một LayoutInflater và chủ yếu chỉ làm xáo trộn vấn đề.
  3. Thổi phồng khung nhìn bằng phương thức đầy đủ của LayoutInflater : inflate(int resource, ViewGroup root, boolean attachToRoot). Đặt attachToRootthành false. Điều này nói với người thổi rằng cha mẹ không có sẵn. Trong các phiên bản cũ hơn của Android Lint, điều này đã loại bỏ cảnh báo. Đây không còn là trường hợp trong phiên bản 1.0 của Android Studio.

Hãy xem http://www.doubleencore.com/2013/05/layout-inflation-as-intends/ để biết một cuộc thảo luận tuyệt vời về vấn đề này, cụ thể là phần "Mọi quy tắc đều có ngoại lệ" ở cuối.


19

Truyền null khi Viewgroup giải quyết cảnh báo:

View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);

nơi liLayoutInflater'sđối tượng.


trong đó 'li' là đối tượng LayoutInflater.
SVL Narasimham

3
Câu trả lời này là tốt nhất, cung cấp cho bạn hiểu TẠI SAO bạn thực sự đang làm điều này. Câu chuyện ngắn, như bạn có thể đã đọc, là AlertDialog không biết cha mẹ của nó tại thời điểm tăng cao, và do đó, đó là một tác dụng phụ đưa ra cảnh báo trong tình huống chính xác này khi bạn thực sự đang làm đúng.
Mar Mar

Tôi đã đọc vô số câu trả lời và trang về cảnh báo này, nhưng giải pháp của bạn là tốt nhất cho đến nay: đơn giản và thanh lịch
Couitchy

9
Nhưng nó là đúc thừa
mohit

11
Sau đó, chúng tôi nhận được một cảnh báo khác "Đúc là dư thừa"!
Mousa

17

Bạn nên sử dụng AlertDialog.Builder.setView(your_layout_id), vì vậy bạn không cần phải thổi phồng nó.

Sử dụng AlertDialog.findViewById(your_view_id)sau khi tạo hộp thoại.

Sử dụng (AlertDialog) dialogInterfaceđể có được dialogbên trong OnClickListenervà sau đó dialog.findViewById(your_view_id).


1
Đây là con đường để đi! Chỉ cần tạo hộp thoại và sau đó tìm thấy quan điểm của bạn.
dùng1806772

1
Đây là một cách tốt để làm điều đó, tuy nhiên hãy nhớ rằng phương pháp này đã được thêm vào API 21
Nicolás Carrasco

Điều gì nếu chúng ta phải lưu trữ bố trí tăng cao này trong một số biến? Ví dụ, tôi đã viết một lớp Atrong đó có phương thức onCreateDialog. Sau này, tôi đã viết như ou nói alert_dialog_builder.setView(R.layout.edit_account_dialog);. Nhưng tôi phải lưu trữ bố cục bị thổi phồng này trong Abiến thuộc tính có tên the_inflated_layout_of_the_dialog.
JarsOfJam-Lập lịch

9

Bạn không cần chỉ định parentmột hộp thoại.

Loại bỏ điều này bằng cách sử dụng @SuppressLint("InflateParams")ở đầu ghi đè.


7

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ó lựa chọn 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 = infalInflater.inflate(R.layout.list_item, nullParent);

4
Nó tạo ra một cảnh báo khác "giá trị 'nullParent' luôn là null."
mallaudin

Kể từ AndroidStudio 3.3 và API 28, đây là giải pháp duy nhất có tác dụng.
zeeshan

1
  1. AlertDialog theo như tôi biết trường hợp duy nhất là bạn có thể sử dụng null một cách an toàn thay vì chế độ xem chính. Trong trường hợp này, bạn có thể chặn cảnh báo bằng cách sử dụng:

    @SuppressLint ("InflateParams")

  2. Nói chung, bạn không bao giờ nên sử dụng SupressLint hoặc một trong các cách giải quyết được đề cập trong các câu trả lời khác để thoát khỏi cảnh báo. Chế độ xem chính là cần thiết để đánh giá Params Bố cục được khai báo trong phần tử gốc của Chế độ xem bị thổi phồng. Điều đó có nghĩa là nếu bạn sử dụng null thay vì chế độ xem chính, tất cả các Params Bố cục trong phần tử gốc sẽ bị bỏ qua và được thay thế bằng Params Bố cục mặc định. Hầu hết thời gian sẽ ổn, nhưng trong một số trường hợp, nó sẽ dẫn đến một lỗi thực sự khó tìm.


0

Từ các tài liệu của View.inflate(), nó nói

Thổi phồng một khung nhìn từ một tài nguyên XML. Phương thức tiện lợi này bao bọc LayoutInflaterlớp, cung cấp đầy đủ các tùy chọn để xem lạm phát.

  @param context The Context object for your activity or application.
  @param resource The resource ID to inflate
  @param root A view group that will be the parent.  Used to properly inflate the  layout_* parameters.

0

Theo https://developer.android.com/guide/topics/ui/dialogs

Thổi phồng và đặt bố cục cho hộp thoại
Truyền null thành dạng xem chính vì nó nằm trong bố trí hộp thoại

do đó, để tạo AlertDialog, tôi sử dụng @SuppressLint("InflateParams")

LayoutInflater inflater = requireActivity().getLayoutInflater();
@SuppressLint("InflateParams")
View view = inflater.inflate(R.layout.layout_dialog, null);
builder.setView(view);

-1

Thay vì làm

view = inflater.inflate(R.layout.list_item, null);

làm

view = inflater.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ẹ.

Rất cám ơn Coeffect ( liên kết đến bài viết của anh ấy )


Nó cũng sẽ hữu ích để biết làm thế nào để có được cha mẹ.
Johan Karlsson
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.