2010-04-15 3 views
244

Sto provando a generare una finestra di dialogo personalizzata in Android. Creo il mio dialogo come questo:Android: come creare una finestra di dialogo senza un titolo?

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

Everythings funziona bene tranne che per il titolo della finestra. Anche se non si imposta il titolo della finestra di dialogo, il popup della finestra di dialogo ha uno spazio vuoto nella posizione della finestra di dialogo.

C'è un modo per nascondere questa parte della finestra di dialogo?

ho provato con un AlertDialog ma sembra il layout non è impostata correttamente:

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 io uso questo codice ottengo un puntatore nullo Eccezione nell'ultima riga. La finestra di dialogo non è nulla, quindi il TextView che cerco di recuperare non esiste.
Se si decommenta la parte in cui utilizzo il Costruttore di dialoghi, tutto funziona correttamente, ma per il titolo sopra il layout della finestra di dialogo.

+0

avete risolto i vostri problemi? –

+7

@Janusz ripeti la risposta a http://stackoverflow.com/a/3407871/632951 – Pacerier

+0

prova http://stackoverflow.com/questions/6263639/android-dialog-removing-title-bar anziché la risposta precedente .. .semplice risposta –

risposta

187

È possibile nascondere il titolo di una finestra di dialogo utilizzando:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


Versione precedente di questa risposta, che è complicata:

È necessario utilizzare un AlertDialog. C'è una buona spiegazione sul sito dello sviluppatore Android su custom dialogs.

In brevissimo riassunto, lo fai con un codice come copiato di seguito dal sito web ufficiale. Questo prende un file di layot ​​personalizzato, lo gonfia, gli dà un testo e un'icona di base, quindi lo crea. Lo mostreresti allora con 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(); 

In risposta a commentare:

Suppongo che TextView con l'id nr è nella vista che si sta gonfiando con View view = inflater..... Se è così, allora devi cambiare solo un bit: invece di dialog.findView... rendilo view.findView.... Poi, una volta fatto, ricordati di usare la finestra di dialogo.show(), o anche builder.show() senza preoccuparsi di fare builder.create().

+4

Penso che potresti aver letto male la domanda? Janusz ha già la finestra di dialogo personalizzata che visualizza e richiede solo informazioni sulla rimozione del titolo –

+17

Bene, secondo la documentazione ufficiale, "Una finestra di dialogo fatta con la classe Dialog di base deve avere un titolo Se non si chiama setTitle(), il lo spazio utilizzato per il titolo rimane vuoto, ma è ancora visibile. Se non vuoi affatto un titolo, dovresti creare la finestra di dialogo personalizzata usando la classe AlertDialog. " Non l'ho mai sperimentato personalmente, ma questo suggerirebbe che anche usando un layout di una finestra di dialogo o dei temi personalizzati, è impossibile rimuovere lo spazio del titolo. –

+2

Secondo pensiero: penso che stiamo capendo il "titolo" in modo diverso. Presumo che stia parlando dello spazio in cima alla finestra pop-up, non del titolo nella parte superiore dell'app. –

66

Nel codice aggiungere questa riga

requestWindowFeature(Window.FEATURE_NO_TITLE); 

O in XML utilizzare un tema

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

XML sarebbe una migliore attuazione, come con la versione del codice della barra del titolo viene creato e poi rimosso, che è uno spreco di risorse

Ok buona prova ma non funziona. I get: android.view.WindowManager $ BadTokenException: Impossibile aggiungere finestra - il token null è non per un'applicazione se voglio shwo la finestra di dialogo.

Modificare la finestra di dialogo tipo di avviso alla finestra di dialogo di sistema (ad esempio, TYPE_SYSTEM_OVERLAY) e vedere se questo risolve il problema

+2

Non chiamare setContentView() prima requestFeature(). – jlopez

55

Usa come questo:

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

Questo consente di eliminare ogni barra del titolo dalla finestra di dialogo.

+0

Grazie !!! ... funziona –

+0

Questa è la risposta giusta – HarshMarshmallow

+3

Non chiamare setContentView() prima requestFeature(). – jlopez

38

è possibile rimuovere il titolo dal

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

cui finestra è il nome della mia finestra.

+0

Non chiamare setContentView() prima di requestFeature() – jlopez

578

FEATURE_NO_TITLE funziona quando si crea una finestra di dialogo da zero, come in:

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

Ma non funziona quando si crea un'AlertDialog (o utilizzando il Generatore), perché disabilita già il titolo e utilizzare un costume uno internamente.

Ho esaminato le origini SDK e penso che non possa essere risolto. Quindi, per rimuovere la spaziatura superiore, l'unica soluzione è creare una finestra di dialogo personalizzata da zero IMO, usando direttamente la classe Dialog.

Inoltre, si può farlo con uno stile, ad esempio in styles.xml:

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

E poi:

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

Di tutte le risposte in questa pagina, questo descrive effettivamente il problema reale e funziona. Grazie – cottonBallPaws

+20

Funziona al 100%, grazie. L'OP ha selezionato la risposta sbagliata! – brk3

+0

Invece di creare una finestra di dialogo personalizzata da zero, ho creato gli styles.xml come suggerito da oliverg. E poi, ho aggiunto android: theme = "@ style/FullHeightDialog" alla dichiarazione ... nel file Manifest. Ha funzionato. Grazie .. – Indrajeet

3

impostare l'attributo "gravità" su tutta la finestra di dialogo per "centro di ". Quindi dovrai eseguire l'override di tale impostazione su tutti i componenti figlio nella finestra di dialogo che non vuoi centrare.

4

Impostare il titolo sulla stringa vuota utilizzando il builder.

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

Nella classe Custom_Dialog.java aggiungere 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 
    } 
} 
+0

Questa è l'unica cosa che ha funzionato per me ... per qualche motivo tutti gli altri suggerimenti non hanno funzionato. L'unica cosa che consiglierei è di rendere pubblico il costruttore e anche di fornire l'altro costruttore di Dialog che prende solo un Contesto – Justin

29

Nel codice se si utilizza requestWindowFeature(Window.FEATURE_NO_TITLE); essere sicuri che precede dialog.setContentView(); altrimenti provoca l'arresto anomalo dell'applicazione.

+0

piuttosto dubito di provare prima e piuttosto sorpreso che funzioni ovviamente. poiché in android.developer.com hanno detto chiaramente che è obbligatorio per un dialogo personalizzato avere un titolo. : P – richardlin

+0

Funziona per la finestra di dialogo personalizzata .. Grande consiglio! –

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

in XML utilizzare un tema

android:theme="@android:style/Theme.NoTitleBar" 
2
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
          "Loading. Please wait...", true); 

crea un titolo meno dialogo

6

olivierg's answer funzionato per me ed è la soluzione migliore se la creazione di una classe di dialogo personalizzato è il percorso che si voglio andare. Tuttavia, mi dava fastidio il fatto che non potevo usare la classe AlertDialog. Volevo essere in grado di utilizzare lo stile AlertDialog di sistema predefinito. La creazione di una classe di dialogo personalizzata non avrebbe questo stile.

Quindi ho trovato una soluzione (hack) che funzionerà senza dover creare una classe personalizzata, è possibile utilizzare i builder esistenti.

AlertDialog mette una vista sopra la vista del contenuto come segnaposto per il titolo. Se trovi la vista e imposta l'altezza su 0, lo spazio scompare.

Ho provato questo su 2.3 e 3.0 finora, è possibile che non funzioni ancora su tutte le versioni.

Qui ci sono due metodi di supporto per farlo:

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

Ecco un esempio di come viene utilizzato:

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

    showDialogWithNoTopSpace(yourCustomView, dialog, true); 

Se si utilizza questo con un DialogFragment, ignorare del onCreateDialog DialogFragment metodo. Quindi crea e ritorna la tua finestra di dialogo come il primo esempio sopra. L'unica modifica è che devi passare falso come terzo parametro (mostra) in modo che non chiami show() nella finestra di dialogo. Il DialogFragment gestirà quello più tardi.

Esempio:

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

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

Come ho prova questo ulteriore sarò sicuro di aggiornare eventuali modifiche aggiuntive necessarie.

+0

Soluzione elegante, +1. Sai come usare questo in un DialogFragment? –

+0

@Binoy ha aggiornato la risposta per DialogFragments (che è in realtà come la utilizzo personalmente) – cottonBallPaws

3

Se usiamo semplicemente la finestra di dialogo senza il setTitle(), allora funzionerà nel rimuovere lo spazio del titolo?

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

ho trovato tre modo per farlo>

1) Utilizzando requestWindowFeature

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

2) Usando stile (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) Utilizzo di XML tema in AndroidManifest.xml

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

Il metodo uno dovrebbe essere dialog.requestWindowFeature (Window.FEATURE_NO_TITLE); –

1

Dopo un po 'di hacking, ho avuto questo lavoro:

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

cosa è 'dialog' qui e' getResources() ' –

53

Usa sotto codice prima setcontentview: -

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

Nota: è necessario disporre sopra il codice, in stesso ordine e linea. requestWindowFeature deve essere prima del la linea setContentView.

+0

Quando si utilizza in un Dialogfragment, questa soluzione funziona meglio per me in quanto la risposta accettata crea un piccolo spazio verticale tra il frame della finestra di dialogo e la vista del contenuto interno. –

6

Non so se questa domanda è ancora attuale, ma nel mio caso, quando sono passato dalla finestra di dialogo per DialogFragment,

requestWindowFeature(Window.FEATURE_NO_TITLE); 

non era un'opzione, ma potrei usare

setStyle(STYLE_NO_TITLE, 0); 

invece con lo stesso risultato.

+0

Per chiarire, questa riga ('setStyle (STYLE_NO_TITLE, 0);') andrà nel metodo onCreate della classe DialogFragment. – Price

3

pensare che si può semplicemente utilizzare questo ora:

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

si può fare questo senza usare AlertDialog definendo nuova classe che si estende da Dialog classe come questa:

public class myDialog extends Dialog { 
    public myDialog(Context context) { 
     super(context); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
    } 
} 
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(); 
    } 
1

Ecco qualcosa puoi fare con AlertBuilder per far sparire il titolo:

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

Durante l'utilizzo AlertDialog, non usando setTitle() rende il titolo scompare

0

Utilizzare questa

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