Android: como criar um diálogo sem título?

269

Estou tentando gerar uma caixa de diálogo personalizada no Android. Eu crio meu Diálogo assim:

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

Tudo funciona bem, exceto pelo título do Diálogo. Mesmo se eu não definir o título da caixa de diálogo, o pop-up da caixa de diálogo terá um espaço em branco na posição da caixa de diálogo.

Existe alguma maneira de ocultar essa parte do diálogo?

Eu tentei com um AlertDialog, mas parece que o layout não está definido corretamente:

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

Se eu usar esse código, recebo uma exceção de ponteiro nula na última linha. A caixa de diálogo não é nula, portanto, o TextView que tento recuperar não existe.
Se eu descomentar a parte em que uso o Dialog Constructor, tudo funcionará bem, exceto no título acima do layout da minha caixa de diálogo.

Janusz
fonte
7
@Janusz rechoose sua resposta a stackoverflow.com/a/3407871/632951
Pacerier
tente stackoverflow.com/questions/6263639/… em vez da resposta anterior ... resposta simples
Mohammed mansoor #
Apenas não chame AlertDialog.Builder.setTitle () e sua caixa de diálogo aparecerá sem título.
marvatron

Respostas:

208

Você pode ocultar o título de uma caixa de diálogo usando:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


Versão anterior desta resposta, que é complicada demais:

Você precisa usar um AlertDialog. Há uma boa explicação no site do desenvolvedor do Android sobre diálogos personalizados .

Em um resumo muito breve, você faz isso com o código copiado abaixo no site oficial. Isso pega um arquivo de layout personalizado, o inflaciona, fornece texto e ícone básicos e depois o cria. Você mostraria isso com 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();

Em resposta ao comentário:

Suponho que o TextView com o ID nresteja no modo de exibição com o qual você está inflando View view = inflater..... Nesse caso, você precisa alterar apenas um pouco: em vez de dialog.findView...fazê-lo view.findView.... Depois de fazer isso, lembre-se de usar dialog.show () ou mesmo builder.show () sem se preocupar em fazer builder.create ().

Steve Haley
fonte
4
Eu acho que você pode ter interpretado mal a pergunta? Janusz já tem o diálogo personalizada exibição e só requer informações sobre como remover o título
Donal Rafferty
17
Bem, de acordo com a documentação oficial, "Uma caixa de diálogo criada com a classe Dialog base deve ter um título. Se você não chamar setTitle (), o espaço usado para o título permanecerá vazio, mas ainda visível. Se você não ' Se você não quiser um título, crie sua caixa de diálogo personalizada usando a classe AlertDialog. " Eu não experimentei pessoalmente, mas isso sugere que, mesmo usando um layout de diálogo personalizado ou temas, é impossível remover o espaço do título.
Steve Haley
2
Segundo pensamento: acho que estamos entendendo o "título" de maneira diferente. Suponho que ele esteja falando sobre o espaço na parte superior da janela pop-up, não sobre o título na parte superior do aplicativo.
Steve Haley
11
@SteveHaley, Não, é possível ocultá-lo usando a seguinte linha #dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy /
1
Certifique-se de fazer dialog.requestWindowFeature (Window.FEATURE_NO_TITLE); ANTES de aumentar a exibição da caixa de diálogo.
Alexey Podlasov
585

FEATURE_NO_TITLE funciona ao criar uma caixa de diálogo do zero, como em:

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

Mas não funciona ao criar um AlertDialog (ou usar o Builder), porque já desativa o título e usa internamente um personalizado.

Examinei as fontes do SDK e acho que não pode ser contornado. Portanto, para remover o espaçamento superior, a única solução é criar uma caixa de diálogo personalizada do zero IMO, usando diretamente a classe Dialog.

Além disso, pode-se fazer isso com um estilo, por exemplo, em styles.xml:

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

E depois:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
olivierg
fonte
Em vez de criar uma caixa de diálogo personalizada do zero, criei o styles.xml, conforme sugerido por oliverg. E então, adicionei android: theme = "@ style / FullHeightDialog" à declaração <activity> ... </acitivity> no arquivo de manifesto. Apenas funcionou. Obrigado ..
Indrajeet 17/09/11
@olivierg mas eu quero um botão com uma caixa de diálogo de altura total. qual é a solução?
Pacerier 12/02/12
1
Observe que a linha requestWindowFeature deve ser ANTES da linha setContentView.
Fattie
Enquanto isso responde melhor aos comentários reais, a solução na resposta aceita é a melhor na minha opinião. Comecei a fazê-lo assim, com uma limpeza Dialog, mas criar uma AlertDialogera muito mais fácil. Como é indicado nos docs : 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>. Ele AlertDialogtambém lida com as coisas do ciclo de vida e aceita / cancela de maneiras fáceis.
Krøllebølle
67

No seu código, adicione esta linha

requestWindowFeature(Window.FEATURE_NO_TITLE);  

Ou, em XML, use um tema

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

XML seria uma implementação melhor, pois com a versão do código, a barra de título é criada e removida, o que é um desperdício de recursos

Ok, boa tentativa, mas não está funcionando. Eu recebo: android.view.WindowManager $ BadTokenException: não é possível adicionar o token de janela nulo não é para um aplicativo se eu quiser mostrar a caixa de diálogo.

Altere o tipo de caixa de diálogo de alerta para caixa de diálogo do sistema (por exemplo, TYPE_SYSTEM_OVERLAY) e veja se isso resolve seu problema

Donal Rafferty
fonte
2
Não chame setContentView () antes de requestFeature ().
jlopez
61

Use assim:

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

Isso removerá qualquer barra de título da janela de diálogo.

alok tiwari
fonte
3
Não chame setContentView () antes de requestFeature ().
jlopez
2
Como faço para devolvê-lo mais tarde?
desenvolvedor android
58

Use o código abaixo antes setcontentview: -

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

Nota : Você deve ter o código acima, na mesma ordem e linha. requestWindowFeaturedeve estar antes da linha setContentView.

duggu
fonte
Ao usar em um fragmento de diálogo, esta solução funciona melhor para mim, pois a resposta aceita cria uma pequena lacuna vertical entre o quadro de diálogo e a exibição de conteúdo interno.
Sebastian Roth
38

você pode remover o título

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

Onde diálogo é o nome do meu diálogo.

shailendra
fonte
Não chame setContentView () antes requestFeature ()
jlopez
29

No seu código, se você usar, requestWindowFeature(Window.FEATURE_NO_TITLE); certifique-se de que o procedimento dialog.setContentView();seja anterior, caso contrário, o aplicativo poderá travar.

Szymon Morawski
fonte
bastante dúvida para tentar antes e bastante surpreso que, obviamente, funciona. pois no android.developer.com eles disseram claramente que é obrigatório que uma caixa de diálogo personalizada tenha um título. : P
richardlin
10

Eu encontrei a Three Way para fazer isso>

1) Usando requestWindowFeature

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

2) Usando style (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) Usando o tema XML no AndroidManifest.xml

 android:theme="@android:style/Theme.NoTitleBar"
Nirav Ranpara
fonte
1
O método um deve ser dialog.requestWindowFeature (Window.FEATURE_NO_TITLE);
21413 Jon Willis
10

Na sua classe Custom_Dialog.java, adicione 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 
    }
}
M_K
fonte
Esta é a única coisa que funcionou para mim ... por algum motivo, todas as outras sugestões não funcionaram. A única coisa que eu recomendaria é fazer com que o público construtor e também para fornecer o outro construtor de diálogo que leva apenas um Contexto
Justin
7

A resposta do olivierg funcionou para mim e é a melhor solução se a criação de uma classe Dialog personalizada for o caminho que você deseja seguir. No entanto, me incomodou não poder usar a classe AlertDialog. Eu queria poder usar o estilo AlertDialog do sistema padrão. Criar uma classe de diálogo personalizada não teria esse estilo.

Então, eu encontrei uma solução (hack) que funcionará sem ter que criar uma classe personalizada; você pode usar os construtores existentes.

O AlertDialog coloca uma exibição acima da exibição de conteúdo como um espaço reservado para o título. Se você encontrar a vista e definir a altura como 0, o espaço desaparecerá.

Eu testei isso em 2.3 e 3.0 até agora, é possível que ainda não funcione em todas as versões.

Aqui estão dois métodos auxiliares para fazer isso:

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

Aqui está um exemplo de como é usado:

    Dialog dialog = new AlertDialog.Builder(this)
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

Se você estiver usando isso com um DialogFragment, substitua o onCreateDialogmétodo do DialogFragment . Em seguida, crie e retorne sua caixa de diálogo como o primeiro exemplo acima. A única alteração é que você deve passar false como o terceiro parâmetro (show) para que ele não chame show () na caixa de diálogo. O DialogFragment tratará disso mais tarde.

Exemplo:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new AlertDialog.Builder(getContext())
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, false);
    return dialog;
}

À medida que for testando mais, não deixarei de atualizar os ajustes adicionais necessários.

cottonBallPaws
fonte
Solução elegante, +1. Você sabe como usar isso em um DialogFragment?
Binoy Babu
@Binoy atualizou a resposta para DialogFragments (que é realmente como eu, pessoalmente, usá-lo)
cottonBallPaws
6

Não sei se essa pergunta ainda é real, mas no meu caso, quando mudei de Dialog para DialogFragment,

requestWindowFeature(Window.FEATURE_NO_TITLE);

não era uma opção, mas eu poderia usar

setStyle(STYLE_NO_TITLE, 0);

em vez disso, com o mesmo resultado.

Analizer
fonte
Para esclarecer, esta linha ( setStyle(STYLE_NO_TITLE, 0);) irá no método onCreate da sua classe DialogFragment.
Preço
4

Defina o título como sequência vazia usando o construtor.

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();
Szere Dyeri
fonte
3

defina o atributo "gravidade" em toda a caixa de diálogo para "centralizar". Você precisará substituir essa configuração por todos os componentes filhos na caixa de diálogo que você não deseja centralizar.

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

em XML use um tema

android:theme="@android:style/Theme.NoTitleBar"
Asad Rao
fonte
3

Se simplesmente usarmos a caixa de diálogo sem a setTitle(), isso funcionará na remoção do espaço do título?

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

Pense que você pode apenas usar isso agora:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()
J2K
fonte
2
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

cria um título menos diálogo

Praveen Kondapalli
fonte
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(); 
     }
Sandeep Kumar Patil
fonte
2

Ao usar o AlertDialog, o não uso setTitle()faz o título desaparecer

kostikus
fonte
1

Depois de muitos hackers, consegui que isso funcionasse:

            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);
Chuck D
fonte
o que é dialogaqui egetResources()
Kartheek s
1

Você pode fazer isso sem usar AlertDialog, definindo a nova classe que se estende da Dialogclasse da seguinte maneira:

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

Aqui está algo que você pode fazer AlertBuilderpara fazer o título desaparecer:

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

Usa isto

    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);
Habibur Rahman Ovie
fonte
0

dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);

isso removerá o título da caixa de diálogo de edição.

Nota adicione estas linhas antes de adicionar conteúdo. Por exemplo

     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)
indrajeet jyoti
fonte