안드로이드 : 제목없이 대화 상자를 만드는 방법은 무엇입니까?


269

Android에서 사용자 정의 대화 상자를 생성하려고합니다. 다음과 같이 대화 상자를 만듭니다.

dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);

대화 상자의 제목을 제외한 모든 것이 잘 작동합니다. 대화 상자의 제목을 설정하지 않아도 대화 상자 팝업에는 대화 상자 위치에 빈 공간이 있습니다.

대화 상자 의이 부분을 숨길 수있는 방법이 있습니까?

AlertDialog로 시도했지만 레이아웃이 올바르게 설정되지 않은 것 같습니다.

LayoutInflater inflater = 
    (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.map_dialog, null);

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);

// dialog = new Dialog(this);
// dialog.setContentView(R.layout.map_dialog);

dialog = builder.create();

((TextView) dialog.findViewById(R.id.nr)).setText(number);

이 코드를 사용하면 마지막 줄에 null 포인터 예외가 발생합니다. 대화 상자가 null이 아니므로 검색하려는 TextView가 존재하지 않습니다.
대화 상자 생성자를 사용하는 부분의 주석 처리를 제거하면 대화 상자 레이아웃 위의 제목에 대해 모든 것이 잘 작동합니다.


7
에 대한 답을 rechoose @Janusz stackoverflow.com/a/3407871/632951
Pacerier

이전 답변 대신 stackoverflow.com/questions/6263639/… 를 시도 하십시오 ... 간단한 답변
Mohammed mansoor

AlertDialog.Builder.setTitle ()을 호출하지 않으면 제목없이 대화 상자가 나타납니다.
marvatron

답변:


208

다음을 사용하여 대화 상자 제목을 숨길 수 있습니다.

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


이 답변의 이전 버전은 너무 복잡합니다.

을 사용해야합니다 AlertDialog. Android 개발자 사이트에 사용자 정의 대화 상자 에 대한 좋은 설명이 있습니다 .

요약하면 공식 웹 사이트에서 아래에 복사 한 것과 같은 코드 로이 작업을 수행합니다. 그것은 사용자 정의 layot ​​파일을 가져 와서 팽창시키고 기본 텍스트와 아이콘을 제공 한 다음 만듭니다. 로 표시하면됩니다 alertDialog.show().

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater)
        mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
        (ViewGroup) findViewById(R.id.layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();

의견에 대한 답변 :

id nr가있는 TextView가 inflating 하는보기에 있다고 가정합니다 View view = inflater..... 그렇다면 dialog.findView...make 대신 한 비트 만 변경해야 합니다 view.findView.... 그런 다음 builder.create ()를 수행하지 않고 dialog.show () 또는 builder.show ()를 사용해야합니다.


4
질문을 잘못 읽은 것 같습니다. Janusz는 이미 사용자 정의 대화 상자를 표시하고 있으며 제목 제거에 대한 정보 만 필요합니다
Donal Rafferty

17
공식 문서에 따르면 "기본 Dialog 클래스로 만든 대화 상자에는 제목이 있어야합니다. setTitle ()을 호출하지 않으면 제목에 사용 된 공간이 비어 있지만 여전히 표시됩니다. 제목을 원하지 않으면 AlertDialog 클래스를 사용하여 사용자 정의 대화 상자를 만들어야합니다. " 개인적으로 실험하지는 않았지만 사용자 정의 대화 상자 레이아웃이나 테마를 사용하더라도 제목 공간을 제거 할 수는 없습니다.
Steve Haley

2
두 번째 생각 : 우리는 "제목"을 다르게 이해하고 있다고 생각합니다. 그가 앱 상단의 제목이 아니라 팝업 창의 상단에있는 공간에 대해 이야기하고 있다고 가정합니다.
Steve Haley

11
@SteveHaley, 아니요 다음 줄을 사용하여 숨길 수 있습니다dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy

1
dialog.requestWindowFeature (Window.FEATURE_NO_TITLE); 대화 상자보기를 팽창시키기 전에.
Alexey Podlasov

585

FEATURE_NO_TITLE은 다음과 같이 대화 상자를 처음부터 만들 때 작동합니다.

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

그러나 AlertDialog를 만들거나 Builder를 사용할 때는 이미 제목을 비활성화하고 사용자 지정 제목을 내부적으로 사용하기 때문에 작동하지 않습니다.

SDK 소스를 살펴본 결과 해결할 수 없다고 생각합니다. 따라서 상단 간격을 제거하려면 유일한 방법은 Dialog 클래스를 직접 사용하여 처음 IMO에서 사용자 지정 대화 상자를 만드는 것입니다.

또한 styles.xml과 같은 스타일을 사용하여이를 수행 할 수 있습니다.

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

그리고:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

처음부터 사용자 정의 대화 상자를 만드는 대신 oliverg에서 제안한대로 styles.xml을 만들었습니다. 그런 다음 매니페스트 파일의 <activity> ... </ acitivity> 선언에 android : theme = "@ style / FullHeightDialog"를 추가했습니다. 방금 작동했습니다. 감사합니다 ..
Indrajeet

@olivierg하지만 전체 높이 대화 상자가있는 버튼을 원합니다. 해결책은 무엇입니까?
Pacerier

1
참고 requestWindowFeature이 있어야합니다 라인 전에 된 setContentView 라인.
Fattie

이것은 실제 의견에 가장 잘 대답하는 반면 받아 들인 대답의 해결책은 내 의견으로는 최고입니다. 나는 이렇게 깨끗하게 시작 Dialog했지만 AlertDialog훨씬 쉽게 만들었습니다 . 문서에 명시된 바와 같이 : The Dialog class is the base class for dialogs, but you should avoid instantiating Dialog directly. Instead, use one of the following subclasses: <AlertDialog and others described here>. 는 AlertDialog또한 라이프 사이클 물건을 처리하고 OK / 쉬운 방식으로 취소 할 수 있습니다.
Krøllebølle

67

코드에서이 줄을 추가하십시오

requestWindowFeature(Window.FEATURE_NO_TITLE);  

또는 XML에서 테마를 사용하십시오.

android:theme="@android:style/Theme.NoTitleBar"

제목 표시 줄이 생성 된 다음 제거되는 코드 버전에서와 같이 XML은 더 나은 구현이 될 것입니다.

시도는 좋지만 작동하지 않습니다. android.view.WindowManager $ BadTokenException : 창을 추가 할 수 없습니다-대화 상자를 표시하려면 응용 프로그램에 대해 토큰 null이 아닙니다.

경고 대화 상자 유형을 시스템 대화 상자 (예 : TYPE_SYSTEM_OVERLAY)로 변경하고 문제가 해결되는지 확인하십시오.


2
requestFeature () 전에 setContentView ()를 호출하지 마십시오.
jlopez

61

다음과 같이 사용하십시오.

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

대화 상자 창에서 제목 표시 줄이 제거됩니다.


3
requestFeature () 전에 setContentView ()를 호출하지 마십시오.
jlopez

2
나중에 다시 가져 오려면 어떻게합니까?
안드로이드 개발자

58

아래 코드를 사용하기 전에 setcontentview:-

    Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.custom_dialog);

참고 : 동일한 순서와 행으로 위의 코드가 있어야합니다. setContentView 줄 앞에requestWindowFeature 있어야합니다 .


Dialogfragment에서 사용할 때 허용되는 답변이 대화 상자 프레임과 내부 내용보기 사이에 작은 수직 간격을 생성하기 때문에이 솔루션이 더 효과적입니다.
Sebastian Roth

38

당신은 제목을 제거 할 수 있습니다

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

여기서 dialog는 내 대화의 이름입니다.


requestFeature () 전에 setContentView ()를 호출하지 마십시오
jlopez

29

코드에서 사용하는 경우 응용 프로그램이 충돌 requestWindowFeature(Window.FEATURE_NO_TITLE); 하기 전에 진행되는지 확인하십시오 dialog.setContentView();.


오히려 전에 시도해보고 분명히 작동한다는 사실에 놀랐습니다. android.developer.com부터 그들은 사용자 정의 대화 상자에 제목이 있어야한다고 분명히 말했습니다. : P
richardlin

10

이 작업을 수행하는 세 가지 방법을 찾았습니다.>

1) requestWindowFeature 사용

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE); 

2) 스타일 사용 (style.xml)

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

3) AndroidManifest.xml에서 XML 테마 사용

 android:theme="@android:style/Theme.NoTitleBar"

1
방법 1은 dialog.requestWindowFeature (Window.FEATURE_NO_TITLE)이어야합니다.
Jon Willis

10

Custom_Dialog.java 클래스에서 requestWindowFeature(Window.FEATURE_NO_TITLE)

public class Custom_Dialog extends Dialog {

    protected Custom_Dialog(Context context, int theme) {
        super(context, theme);
        // TODO Auto-generated constructor stub
        requestWindowFeature(Window.FEATURE_NO_TITLE); //This line 
    }
}

이것은 나를 위해 일한 유일한 것입니다 ... 어떤 이유로 다른 모든 제안이 효과가 없었습니다. 내가 권장하는 유일한 것은 생성자를 공개하고 컨텍스트 만 취하는 다른 대화 상자 생성자를 제공하는 것입니다.
Justin

7

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

이것을 더 테스트 할 때 필요한 추가 조정으로 업데이트 할 것입니다.


우아한 솔루션, +1. DialogFragment에서 이것을 사용하는 방법을 알고 있습니까?
Binoy Babu

@Binoy는 DialogFragments에 대한 답변을 업데이트했습니다 (실제로 개인적으로 사용하는 방식)
cottonBallPaws

6

이 질문이 여전히 실제인지는 모르겠지만 제 경우에는 Dialog에서 DialogFragment로 전환했을 때,

requestWindowFeature(Window.FEATURE_NO_TITLE);

옵션이 아니었지만 사용할 수있었습니다

setStyle(STYLE_NO_TITLE, 0);

대신 동일한 결과가 나타납니다.


명확히하기 위해이 줄 ( setStyle(STYLE_NO_TITLE, 0);)은 DialogFragment 클래스의 onCreate 메소드로 이동합니다.
가격

4

빌더를 사용하여 제목을 빈 문자열로 설정하십시오.

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();

3

전체 대화 상자에서 "중력"속성을 "중앙"으로 설정하십시오. 그런 다음 대화 상자에서 가운데에 원하지 않는 모든 하위 구성 요소로 해당 설정을 재정의해야합니다.


3
dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);


3

우리가 단순히 대화 상자를 사용하지 않으면 setTitle()제목의 공간을 제거하는 것이 효과가 있습니까?

mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();

3

지금 이것을 사용할 수 있다고 생각하십시오.

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()

2
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

제목이 적은 대화 상자를 만듭니다.


2
public static AlertDialog showAlertDialogWithoutTitle(Context context,String msg) 
     {
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
      alertDialogBuilder.setMessage(msg).setCancelable(false)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {

         }
        });

       return alertDialogBuilder.create(); 
     }

2

AlertDialog를 사용하는 동안 사용하지 않으면 setTitle()제목이 사라집니다.


1

많은 해킹 후이 작업을 수행했습니다.

            Window window = dialog.getWindow();
            View view = window.getDecorView();
            final int topPanelId = getResources().getIdentifier( "topPanel", "id", "android" );
            LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
            topPanel.setVisibility(View.GONE);

dialog여기에 무엇입니까getResources()
Kartheek s

1

다음 과 같이 AlertDialog클래스에서 확장되는 새 클래스를 정의 하여 사용하지 않고도이 작업을 수행 할 수 있습니다 Dialog.

public class myDialog extends Dialog {
    public myDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}

1

AlertBuilder제목이 사라지도록 할 수있는 작업은 다음과 같습니다 .

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);

1

이것을 사용하십시오

    Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.setCancelable(true);
    dialog.setContentView(R.layout.image_show_dialog_layout);

0

dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);

이것은 cutsom 대화 상자에서 제목을 제거합니다.

내용을 추가하기 전에이 줄을 추가하십시오. 예 :

     dialog_custom = Dialog(activity!!)
    dialog_custom.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog_custom.setContentView(R.layout.select_vehicle_type)
    dialog_custom.setCanceledOnTouchOutside(false)
    dialog_custom.setCancelable(true)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.