AlertDialog에서 사용하기 위해 뷰를 부 풀릴 때 "뷰 루트로 null을 전달하지 마십시오"경고


126

as로 Avoid passing null as the view root뷰를 부 풀릴 때 보푸라기 경고가 나타납니다 .nullparent

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

그러나 뷰는 on을 AlertDialog사용하여 의 컨텐츠로 사용 setView됩니다.AlertDialog.Builder 되므로으로 전달되어야하는 것을 모르겠습니다 parent.

parent이 경우에 무엇이 있어야 한다고 생각 하십니까?


2
null 대신 false를 전달하십시오. 볼
MrDumb

null 대신 부모 레이아웃을 지정하고 setView를 사용하지 마십시오.
Haresh Chhelana

방법에 대한 보풀 경고를 억제합니다. 나는 내가 통과해서는 안되는 좋은 이유를 아직 보지 못했다 null.
323go 2009 년

4
부모보기에 따라 레이아웃 문제를 이해하지만 실제로 활동의보기 계층 구조 위에 떠있는 AlertDialog에는 적용되지 않습니다. 당신이 통과 할 수있는 이유 null입니다. 보푸라기를 억제 할 수있는 이유가 있습니다. Lint는 자주 놓친 문제에 대해 경고를 제공합니다. 이 경우 올바른 호출입니다.
323go

1
@ ashutiwari4 나는 매일 새로운 새로운 것을 배우고 있습니다 .. 아름다운 세상 : I
Rahul

답변:


174

이 코드를 사용하여 경고없이 대화 상자보기를 확장하십시오.

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

7
@ MarianPaździoch 경고가 발생하지 않기 때문입니다. :-) 물론, 린트 코드를 취급하는 이유의 구걸 질문 View.inflateLayoutInflator.inflate다르게. 나는 확실한 답을 보지 못했다. 그것은 동일한 견해를 팽창시키는 두 가지 겉보기에 동등한 방법이있는 이유와 관련이있을 수 있습니다.
Edward Brey

12
이것은 잘못이다. 경고 만 표시하지 않지만 여전히 문제가 있습니다. 더 나은 솔루션을 위해 가능한 mobile.com/2013/05/layout-inflation 을 읽으십시오 .
jcsahnwaldt Reinstate Monica

16
@JonaChristopherSahnwaldt 좀 더 자세히 설명해 주시겠습니까? 이 기사에서는 AlertDialog에는 루트보기가 없으므로 null 부모가 있어야한다고 말합니다. 나에게 경고는 대화 상자 외부의보기에는 의미가 있지만 대화 상자보기에는 적용되지 않는다는 것을 강화하는 것 같습니다.
Edward Brey

7
@EdwardBrey 당신이 맞아요-나는 기사를 철저히 읽지 않았습니다. 이 특별한 경우, 사용 중 괜찮은지 View.inflate(...null)@SuppressLint. 일반적으로 LayoutInflater.from(...).inflate(..., parent, false)더 좋습니다. 이것을 지적 해 주셔서 감사합니다!
jcsahnwaldt Reinstate Monica

1
@Bevor That null 질문을 피하는 것은 부모가있는 경우에 관한 것입니다. 이 질문은에 관한 것으로 AlertDialog, 팽창 된 뷰에 대한 부모를 제공하지 않습니다. 의 루트 뷰를 팽창시킬 때 AlertDialognull을 전달하는 것이 정확합니다. Lint는이 특정 상황을 설명하지 않으므로 parent오류가 발생하기 쉬운 것이 아니라 오 탐지 함수를 사용하는 경우 경고를 표시합니다 . 그렇기 때문에이 경우 parent에는 경고 를 발생시키지 않는 함수를 사용하는 것이 유효합니다 .
Edward Brey

35

짧은 이야기는 parent보기 인플레이션 시간에 알려지지 않았기 때문에 대화 상자의 뷰를 팽창시킬 때 null이되어야한다는 것입니다. 이 경우 경고를 피하기위한 세 가지 기본 솔루션이 있습니다.

  1. @Suppress를 사용하여 경고를 표시하지 않습니다
  2. View의 팽창 방법을 사용하여 View를 팽창시킵니다 . 이것은 LayoutInflater의 래퍼 일 뿐이며 대부분 문제를 난독 화합니다.
  3. LayoutInflater에서의 사용보기 부풀려 전체 방법 : inflate(int resource, ViewGroup root, boolean attachToRoot). 설정 attachToRootfalse.This은 부모가없는 것을 인플레이터를 알려줍니다. 이전 버전의 Android Lint에서는 경고가 제거되었습니다. 1.0 이후 버전의 Android Studio에서는 더 이상 적용되지 않습니다.

확인 http://www.doubleencore.com/2013/05/layout-inflation-as-intended/을 ,이 문제의 큰 논의 끝에 특히 "모든 규칙은 예외를 가지고"섹션을 참조하십시오.


19

ViewGroup이 경고를 해결하면 null을 캐스팅합니다.

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

개체 li는 어디에 있습니까 LayoutInflater's?


여기서 'li'는 LayoutInflater 객체입니다.
SVL Narasimham

3
이 답변이 가장 좋습니다. 실제로 왜 이런 일을하는지 이해할 수 있습니다. 짧은 이야기는 이미 읽었 듯이 AlertDialog는 팽창 시간에 부모를 알지 못하기 때문에 실제로 올바른 일을 할 때 보푸라기 가이 정확한 상황에서 경고를 던지는 부작용입니다.
Mar Bar

이 경고에 대한 수많은 답변과 페이지를 읽었지만 귀하의 솔루션은 지금까지 최고입니다. 간단하고 우아함
Couitchy

9
그러나 그것은 여분의 캐스팅이다
mohit

11
그런 다음 "캐스팅이 중복됩니다"라는 경고가 나타납니다!
Mousa

17

사용해야합니다 AlertDialog.Builder.setView(your_layout_id) 하므로 팽창시킬 필요가 없습니다.

사용하다 AlertDialog.findViewById(your_view_id)대화 상자를 만든 후 .

사용 (AlertDialog) dialogInterface얻을 dialog내부에 OnClickListener다음 dialog.findViewById(your_view_id).


1
이것은 갈 길입니다! 대화 상자를 만든 다음보기를 찾으십시오.
user1806772

1
이 방법을 사용하는 것이 좋은 방법이지만이 방법 은 API 21에 추가되었습니다.
Nicolás Carrasco

이 팽창 된 레이아웃을 변수에 저장해야한다면 어떻게해야합니까? 예를 들어, A메소드가 있는 클래스 를 작성했습니다 onCreateDialog. 후자에서 나는 ou가 말한대로 썼다 alert_dialog_builder.setView(R.layout.edit_account_dialog);. 그러나이 팽창 된 레이아웃을 A의 속성 변수 에 저장해야합니다 the_inflated_layout_of_the_dialog.
JarsOfJam-Scheduler

9

당신은을 지정할 필요가 없습니다 parent대화 상자 .

@SuppressLint("InflateParams")재정의 맨 위에 사용하여 이것을 억제하십시오 .


7

실제로 parent(예 :에 대한 뷰 만들기 AlertDialog)가 없으면을 전달하는 것 외에 다른 선택이 없습니다 null. 경고를 피하려면 다음을 수행하십시오.

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

4
"value 'nullParent'는 항상 null입니다."라는 또 다른 경고를 생성합니다.
mallaudin

AndroidStudio 3.3 및 API 28부터는 이것이 작동하는 유일한 솔루션입니다.
zeeshan

1
  1. AlertDialog는 내가 아는 한 안전하게 null을 안전하게 사용할 수 있다는 것입니다. 부모보기 대신 입니다. 이 경우 다음을 사용하여 경고를 억제 할 수 있습니다.

    @SuppressLint ( "InflateParams")

  2. 일반적으로 SupressLint 또는 다른 답변에 언급 된 해결 방법 중 하나를 사용하여 경고를 제거해서는 안됩니다. 부모 뷰는 팽창되는 뷰의 루트 요소에 선언 된 레이아웃 매개 변수를 평가하는 데 필요합니다. 즉 , 부모보기 대신 null 을 사용 하면 루트 요소의 모든 레이아웃 매개 변수가 무시되고 기본 레이아웃 매개 변수로 바뀝니다. 대부분의 경우 문제가 없지만 경우에 따라 찾기 어려운 버그가 발생할 수 있습니다.


0

의 문서에서 View.inflate(), 그것은 말한다

XML 리소스에서 뷰를 부풀립니다. 이 편리한 방법은 LayoutInflater클래스를 래핑하여 뷰 인플레이션에 대한 모든 옵션을 제공합니다.

  @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

https://developer.android.com/guide/topics/ui/dialogs 에 따르면

대화 상자의 레이아웃 확장 및 설정
대화 상자 레이아웃으로 이동하기 때문에 null을 부모 뷰로 전달

따라서 AlertDialog를 만들 때 사용합니다. @SuppressLint("InflateParams")

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

-1

대신에

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

하다

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

주어진 부모와 함께 팽창 시키지만 부모에게 첨부하지는 않습니다.

Coeffect에게 많은 감사 ( 그의 게시물에 링크 )


부모를 얻는 방법을 아는 것도 도움이 될 것입니다.
Johan Karlsson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.