2012-11-08 3 views
9

Io utilizzare Android android.app.Dialog per creare una finestra di dialogo personalizzata (per il tasto e lo sfondo) Nella mia finestra di dialogo I ha un TextView all'interno di un ScrollView mentre io ha un breve testo questo spettacolo in ottima come voglio, ma se il il testo è molto grande il mio Dialog prende tutto lo schermo e voglio avere un margine minimo tra la finestra di dialogo e il bordo dello schermo.Android: margine minimo di dialogo

Il mio problema è che il Dialogo non è più grande di quello che serve e non posso impostare una dimensione fissa su questo?

Here is how this look today.....I what a margin like this

How my Dialog is now.I want a margin like this.


Il GameDialog.java

public class GameDialog extends Dialog { 

    public GameDialog(Context ct, int titleID, int messageID) { 
     super(ct, R.style.dialog_style); 
     this.setContentView(R.layout.dialog_layout); 

    } 
    // This exist more code but this has noting with the layout to do,only set the text and show the button that exist since the XML file. 

} 

Il R.style.dialog_style

<style name="dialog_style" parent="@android:style/Theme.Dialog"> 
    <item name="android:windowBackground">?button_image</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:textColor">#FF000000</item> 
    <item name="android:textSize">20sp</item> 
</style> 

Il R.layout.dialog_layout

<?xml version="1.0" encoding="utf-8"?> 


<!-- Dialog layout that show title and a textarea, and under this allow a row of button that is center layout. --> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <LinearLayout android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginLeft="14px" 
        android:layout_marginRight="14px"> 


     <TextView 
      android:layout_gravity="center_vertical"  
      android:id="@+id/text_title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"> 
     </TextView> 

    </LinearLayout> 

    <LinearLayout android:orientation="vertical"  
        android:layout_width="fill_parent" 
        android:layout_height="0px" 
        android:layout_weight="1" 
        android:layout_marginLeft="14px" 
        android:layout_marginRight="14px"> 

     <ScrollView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
     > 

      <TextView android:id="@+id/text_main" 
         android:padding="5px" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
      > 
      </TextView> 

     </ScrollView> 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/layout_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:orientation="horizontal"> 
      <!-- this will be show while need to show a button --> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
    </LinearLayout> 
</LinearLayout> 
+0

Scusa, ho frainteso la tua domanda con la mia prima risposta. –

+0

Nessun problema, hai altri idi? –

+0

Risposta aggiornata. –

risposta

11

Il quadro fa in realtà questo sullo sfondo immagini stesse. In altre parole, se si dispone di uno sguardo al tema definito per il quadro, il loro attributo windowBackground è solo un colore chiaro, vale a dire:

<item name="android:windowBackground">@android:color/transparent</item> 

E poi l'immagine di sfondo posizionato sulla voce di layout radice è un 9- patch dotata di imbottitura incorporata su tutti i lati (ovvero spazio extra incorporato nell'immagine in modo che quando l'immagine si allunga per riempire lo schermo che è ancora visibile intorno ai bordi). Dai uno sguardo a uno dei pannelli della sorgente AOSP per avere un'idea di cosa intendo (link).

Quindi per la vostra soluzione che consiglierei due cose:

  1. Modificare il tuo stile personalizzato con il windowBackground come ho descritto sopra
  2. Aggiornare l'immagine di sfondo personalizzata per includere tale margine trasparente inerente

Per il passaggio 2, se l'immagine è attualmente una patch a 9, fai la stessa cosa che ha fatto Google. Se è stata creata l'immagine in XML, è possibile utilizzare un <layer-list> come il seguente esempio per incorporare il rettangolo visibile all'interno di un altro con imbottitura:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
     <shape android:shape="rectangle" > 
      <solid android:color="@android:color/transparent" /> 
      <padding 
       android:bottom="10dp" 
       android:left="10dp" 
       android:right="10dp" 
       android:top="10dp" /> 
     </shape> 
    </item> 
    <!-- This shape will be inset by the padding set above --> 
    <item> 
     <shape android:shape="rectangle" > 
      <solid android:color="#262626" /> 
     </shape> 
    </item> 
</layer-list> 

L'imbottitura non trasferisce al contenuto in questo caso, quindi sarà anche è necessario aggiungere padding all'elemento del layout di root in modo che corrisponda ai limiti del contenuto con la visualizzazione dell'immagine.

+0

Funziona molto bene, so di cercare il codice basato su Android ma trovo questo alcune volte difficile trovare una pagina di lavoro che abbia tutti i dati e mostri i file * .java completi. –

+0

È possibile ottenere i valori di riempimento predefiniti del dialogo in fase di esecuzione? Non riesco a trovare dove sia :( –

+0

Utilizzando Hierarchy Viewer, ho scoperto che il "padding predefinito della finestra di dialogo" deriva da alertdialog stesso e dal suo contenuto parentView.I padding valori tutti hardcoded: http://goo.gl/0mfHkm http : //goo.gl/mgBsDE –

0

Basta aggiungere i margini di layout per il livello superiore ViewGroup (il vostro LinearLayout).

Inoltre, sono disponibili molti layout nidificati non necessari e non devono essere utilizzate unità pixel. Il tuo dialog_layout.xml dovrebbe più simile a questa:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="14dp" > 

    <TextView 
     android:id="@+id/text_title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingRight="14dp" 
     android:paddingLeft="14dp" /> 

    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingRight="14dp" 
     android:paddingLeft="14dp"> 

     <TextView 
      android:id="@+id/text_main" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 

    </ScrollView> 

    <LinearLayout 
     android:id="@+id/layout_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:orientation="horizontal"> 
      <!-- this will be show while need to show a button --> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
     <ImageView 
      style="?icon_size.button" 
      android:visibility="gone"/> 
    </LinearLayout> 
</LinearLayout>