olivierg의 대답 은 저에게 효과적이며 사용자 정의 대화 상자 클래스를 만드는 것이 가고 싶은 경로 인 경우 가장 좋은 솔루션입니다. 그러나 AlertDialog 클래스를 사용할 수 없다는 것이 귀찮았습니다. 기본 시스템 AlertDialog 스타일을 사용하고 싶었습니다. 사용자 정의 대화 상자 클래스를 만들면이 스타일이 없습니다.
그래서 사용자 정의 클래스를 만들지 않고도 작동하는 솔루션 (핵)을 찾았습니다. 기존 빌더를 사용할 수 있습니다.
AlertDialog는 컨텐츠보기 위에 제목의 자리 표시 자로보기를 배치합니다. 뷰를 찾고 높이를 0으로 설정하면 공간이 사라집니다.
지금까지 2.3 및 3.0에서 이것을 테스트했지만 아직 모든 버전에서 작동하지 않을 수 있습니다.
이를위한 두 가지 도우미 방법이 있습니다.
/**
* Show a Dialog with the extra title/top padding collapsed.
*
* @param customView The custom view that you added to the dialog
* @param dialog The dialog to display without top spacing
* @param show Whether or not to call dialog.show() at the end.
*/
public static void showDialogWithNoTopSpace(final View customView, final Dialog dialog, boolean show) {
// Now we setup a listener to detect as soon as the dialog has shown.
customView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Check if your view has been laid out yet
if (customView.getHeight() > 0) {
// If it has been, we will search the view hierarchy for the view that is responsible for the extra space.
LinearLayout dialogLayout = findDialogLinearLayout(customView);
if (dialogLayout == null) {
// Could find it. Unexpected.
} else {
// Found it, now remove the height of the title area
View child = dialogLayout.getChildAt(0);
if (child != customView) {
// remove height
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
lp.height = 0;
child.setLayoutParams(lp);
} else {
// Could find it. Unexpected.
}
}
// Done with the listener
customView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
// Show the dialog
if (show)
dialog.show();
}
/**
* Searches parents for a LinearLayout
*
* @param view to search the search from
* @return the first parent view that is a LinearLayout or null if none was found
*/
public static LinearLayout findDialogLinearLayout(View view) {
ViewParent parent = (ViewParent) view.getParent();
if (parent != null) {
if (parent instanceof LinearLayout) {
// Found it
return (LinearLayout) parent;
} else if (parent instanceof View) {
// Keep looking
return findDialogLinearLayout((View) parent);
}
}
// Couldn't find it
return null;
}
사용 방법의 예는 다음과 같습니다.
Dialog dialog = new AlertDialog.Builder(this)
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, true);
이것을 DialogFragment와 함께 사용하는 경우 DialogFragment의 onCreateDialog
메소드를 대체하십시오 . 그런 다음 위의 첫 번째 예와 같이 대화 상자를 작성하고 리턴하십시오. 유일한 변경 사항은 대화 상자에서 show ()를 호출하지 않도록 세 번째 매개 변수 (show)로 false를 전달해야한다는 것입니다. DialogFragment가 나중에 처리합니다.
예:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
이것을 더 테스트 할 때 필요한 추가 조정으로 업데이트 할 것입니다.