2012-11-08 35 views
9

używam android android.app.Dialog do utworzenia okna niestandardowe (dla przycisku i tła) W moim Dialog I ma TextView wewnątrz ScrollView a ja ma krótki tekst ten pokaz perfecly jak chcę, ale jeśli tekst jest bardzo duży, moje okno dialogowe zajmuje cały ekran i chcę mieć minimalny margines między oknem dialogowym a krawędzią ekranu.Android: Dialog minimalny margines

Mój problem polega na tym, że chcę, aby okno dialogowe nie było większe niż potrzeba i nie mogę ustawić w tym celu rozmiaru poprawki?

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

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


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. 

} 

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> 

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

Przykro mi, źle zrozumiałem twoje pytanie pierwszą odpowiedzią. –

+0

Nie ma problemu, masz jakieś inne wskazówki? –

+0

Zaktualizowana odpowiedź. –

Odpowiedz

11

Framework faktycznie robi to na samych obrazach tła. Innymi słowy, jeśli spojrzeć na temat określonej dla ram, ich atrybut windowBackground jest tylko jasny kolor, to znaczy:

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

A potem obraz tła umieszczony na elemencie układu korzeń jest 9- łatka, która ma wbudowane wypełnienie wokół wszystkich boków (np. dodatkowa przestrzeń wbudowana w obraz, więc gdy obraz się rozciąga, aby wypełnić ekran, nadal widać wokół krawędzi). Spójrz na jeden z paneli ze źródła AOSP, aby zorientować się, o co mi chodzi (link).

Więc dla rozwiązania Polecam dwie rzeczy:

  1. zmodyfikować swój styl niestandardowy z windowBackground jak opisałem powyżej
  2. zaktualizować swoje tło obrazu niestandardowego zawierać że wrodzonej przejrzysty marginesu

W przypadku etapu 2, jeśli obraz jest obecnie w wersji 9-plasterkowej, wykonaj to samo, co robił Google. Po utworzeniu obrazu w formacie XML, można użyć <layer-list> jak następującej próby osadzić widoczny prostokąt wewnątrz drugiego z padding:

<?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> 

Wyściółka nie przenosi się do treści w tym przypadku, tak będzie również trzeba dodać dopełnienie do elementu układu głównego, aby dopasować ograniczenia treści do ekranu obrazu.

+0

Działa to bardzo dobrze, wiem, aby wyszukać kod oparty na Androidzie, ale czasem trudno znaleźć działającą stronę, która zawiera wszystkie dane i wyświetla pełne pliki * .java. –

+0

Czy możemy uzyskać domyślne wartości wypełnienia w oknie dialogowym w czasie wykonywania? Po prostu nie mogę znaleźć, gdzie to jest :( –

+0

Korzystając z Hierarchy Viewer, dowiedziałem się, że "domyślne wypełnienie okna dialogowego" pochodzi z samego alertdialog i jego nadrzędnego contentView. Wartości dopełnienia są wszystkie zakodowane na stałe: http://goo.gl/0mfHkm http : //goo.gl/mgBsDE –

0

Wystarczy dodać marginesy układu do najwyższego poziomu ViewGroup (Twój LinearLayout).

Ponadto istnieje wiele niepotrzebnych układów zagnieżdżonych i nie należy używać jednostek pikseli. Twój plik dialog_layout.xml powinien wyglądać mniej więcej tak:

<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> 
Powiązane problemy