2012-04-14 14 views
1

Ich versuche herauszufinden, für mehrere Bildschirmgrößen/Dichten/etc entwerfen. Ich dachte "DP" war meine Antwort, aber es funktioniert nicht so, wie ich es dachte.Android: Design auf Breite erweitern

Hier ist, was ich versuche zu tun:

ich eine Kopf- und Fußbereich für Menüpunkte, die statisch bleiben. Dann habe ich eine ScrollView zwischen den 2. Innerhalb der ScrollView befinden sich mehrere "Blöcke", die verschiedene Informationen anzeigen. Ich möchte diese Blöcke immer auf die volle Breite des Bildschirms erweitern. Ich möchte die Höhe dieser Blöcke einfach skalieren, um eine richtige 1: 1 -> Höhe: Breite Skala zu behalten. Ich möchte auch, dass die TextViews/Images/Buttons/etc skalieren und ihre Position innerhalb des Blocks behalten. Wenn die Blockhöhe für den Bildschirm zu groß wird, kommt der ScrollView ins Spiel. Wenn sie gut passen, ist das auch in Ordnung. Ich möchte hauptsächlich auf Breite skalieren und den Benutzer bei Bedarf scrollen lassen.

Zeit, wenn der Bildschirm breiter wird, erhalten die Blöcke wirklich breit, aber nicht skalieren die Höhe sie in passen.

hier ein Grund ist (vereinfacht für Ablesbarkeiten Sake) Überblick über, was meine XML-Layout-Code sieht aus wie . Beachten Sie auch, dass jeder Block eine andere Größe haben kann. Ich suche keine "25% ige Lösung". Die Blöcke haben ziemlich komplexe und völlig unterschiedliche Layouts in ihnen.

<LinearLayout> 
    <RelativeLayout>Header stuff</RelativeLayout> 

    <ScrollView> //height and width = match_parent width lower priority than header/footer 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="???" //Had been using a specified "dp" value but that didn't work like I thought. What goes here? 
     > 
       Block#1 with lots of TextViews, ImageViews and Buttons...etc 
     </RelativeLAyout> 

     <RelativeLayout> 
       Block#2 
     </RelativeLAyout> 

     <RelativeLayout> 
       Block#3... etc 
     </RelativeLAyout> 

    </ScrollView> 

    <RelativeLayout>Footer stuff</RelativeLayout> 

</LinearLayout> 

Antwort

0

Ein Weg, ‚perfekt‘ 1 zu erreichen: 1-Verhältnis (oder ein andere vordefinierte Verhältnisse) eine Ansicht ist Ihre benutzerdefinierte Erweiterung davon zu erstellen und die onMeasure() Methode außer Kraft setzen. in Ihrem Fall könnten Sie ein SquareRelativeLayout mit einem onMeasure() Methode suchen so etwas wie dies wollen:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int width = MeasureSpec.getSize(widthMeasureSpec); 
    setMeasuredDimension(width, width); 
} 

Edit: Wenn Sie ein eigenes Verhältnis möchten, können Sie es irgendwo und messen Sie Ihre Ansicht wie folgt definieren:

float ratio = 0.5f; 
@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int width = MeasureSpec.getSize(widthMeasureSpec); 
    setMeasuredDimension(width, ratio*width); 
} 

Wenn Sie wissen, wie Sie Ihre eigenen XML-Attribute erstellen, können Sie das Attribut ratio hinzufügen und von dort abrufen, was bedeutet, dass Sie für jedes unterschiedliche Verhältnis keine neue Ansicht erstellen müssen.

+0

Kühl. Ich werde das weiter untersuchen müssen. Obwohl ich nicht unbedingt möchte, dass es "quadratisch" ist. Ich habe es in meiner Frage vielleicht schlecht erklärt. Es könnte ein Verhältnis von 2: 1 oder 3: 2 haben. Ich möchte nur, dass die Höhe entsprechend angepasst wird, damit der Block die gesamte Breite einnimmt und die Höhe entsprechend erweitert wird. – user1269977

+0

@ user126977: Sie können diese Methode erweitern, um Ansichten zu erstellen, für die Sie ein benutzerdefiniertes Verhältnisattribut festlegen können. Ich werde meine Antwort aktualisieren – Jave