2013-06-10 3 views
10

Ich versuche, eine vertikale lineare Layout mit Gewichten zu erstellen, die eine Größe größer als der Bildschirm hat. Sagen wir zweimal die Größe des Bildschirms. Damit dies funktioniert, müsste ich natürlich in der Lage sein, durch sie zu scrollen. Leider kann ich keinen Weg finden, dies zu tun. Ich habe versucht, die Gewichtungen zu verwenden und die Gewichtssumme als die Hälfte der tatsächlichen Summe der Gewichte aller Komponenten zu setzen (wenn also alle Komponenten Gewichtssumme 20 sind, setze ich die Gewichtssumme als 10) und schaffte es, es zu funktionieren, aber leider Scrollen funktioniert aus irgendeinem Grund nicht mehr.Scrollbare Linearlayout mit Gewichten größer als Bildschirm in Android

Gibt es etwas, das ich vermisse?

dies ist der Code, den das Linearlayout doppelt so groß wie der Bildschirm, aber die Scroll funktioniert nicht macht:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:fillViewport="true"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:weightSum="2"> 

     <EditText android:id="@+id/id1" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:textSize="25dp" 
      android:gravity="center" 
      android:layout_weight="2"/> 

     <EditText android:id="@+id/id2" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:textSize="25dp" 
      android:gravity="center" 
      android:layout_weight="2"/> 

    </LinearLayout> 
</ScrollView> 

Antwort

7

Basierend auf Ihrem Kommentar, hier ist eine programmatische Art zu erreichen, was Sie suchen. Ich glaube nicht, dass es einen Weg gibt, dies in reinem Layout-XML zu erreichen.

Layout:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal" 
    android:background="#000000" 
    android:fillViewport="true" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#FFFFFF" 
     android:orientation="vertical" > 

     <EditText 
      android:id="@+id/id1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#DCDCDC" 
      android:gravity="center" 
      android:text="ONE ONE ONE" 
      android:textIsSelectable="false" 
      android:textSize="45sp" /> 

     <EditText 
      android:id="@+id/id2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#AAAAAA" 
      android:gravity="center" 
      android:text="TWO TWO TWO" 
      android:textIsSelectable="false" 
      android:textSize="45sp" /> 

     <EditText 
      android:id="@+id/id3" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#777777" 
      android:gravity="center" 
      android:text="THREE THREE THREE" 
      android:textIsSelectable="false" 
      android:textSize="45sp" /> 
    </LinearLayout> 

</ScrollView> 

Aktivität:

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Get display size -- API L13 and up. Otherwise use getResources().getDisplayMetrics(); 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 


     // You want size to be 50% per EditText, so divide available height by 2. 
     // Note: this is absolute height, does not take into consideration window decoration! 
     int editTextHeight = size.y/2; 

     // Get a handle to your EditTexts 
     EditText t1 = (EditText) findViewById(R.id.id1); 
     EditText t2 = (EditText) findViewById(R.id.id2); 
     EditText t3 = (EditText) findViewById(R.id.id3); 

     // Set height to 50% of screen size each 
     t1.setHeight(editTextHeight); 
     t2.setHeight(editTextHeight); 
     t3.setHeight(editTextHeight); 
} 

Das wird es tun.Endergebnis:

EditText 50% screen height EditText 50% screen height EditText 50% screen height

+2

danke für die Antwort. Ich wusste, wie man das programmatisch macht, aber immer noch die Prämie wert, nur um zu bestätigen, dass es in reinem XML nicht möglich ist –

1

Das Problem hier ist die Nutzung von layout_weight und weightSum ist ungültig. Es ist wichtig, sich daran zu erinnern, dass android:layout_weight nur den verbleibenden verfügbaren Platz in der Ansicht verwenden kann; Alles, was diese Grenze überschreitet, wird automatisch abgeschnitten.

Daher nimmt in Ihrem Beispiel Ihre erste EditText den gesamten Bildschirm auf, und Ihre zweite ist vollständig von der Ansicht ausgeschlossen. Da die zweite EditText abgeschnitten ist, hat die LinearLayout den gesamten Bildschirm genommen und es gibt nichts für die ScrollView zu tun.

Ich bin mir nicht ganz sicher, was dein Endziel ist; Versuchen Sie, Texteingaben zu haben, die mit Benutzereinträgen wachsen, und ScrollView den Überlauf behandelt?

Wenn ja, wird diese Arbeit:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal" 
    android:background="#000000" 
    android:fillViewport="true" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#FFFFFF" 
     android:orientation="vertical" > 

     <EditText 
     android:id="@+id/id1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#DCDCDC" 
     android:gravity="center" 
     android:text="ONE ONE ONE" 
     android:textIsSelectable="false" 
     android:textSize="45sp" /> 

    <EditText 
     android:id="@+id/id2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#AAAAAA" 
     android:gravity="center" 
     android:text="TWO TWO TWO" 
     android:textIsSelectable="false" 
     android:textSize="45sp" /> 
    </LinearLayout> 

</ScrollView> 

ich einige Farben grundlegende Hintergrund aufgenommen haben, so dass Sie sehen können, wo jedes Element & Enden in Layout-Vorschau beginnt. Die Eingabe in der ersten EditText wird die zweite korrekt nach unten drücken und eine Bildlaufleiste erzeugen.

Beachten Sie auch, dass Sie sp anstelle von dp für textSize Werte verwenden sollten.

Edit: Ich sollte auch zur Verdeutlichung beachten, dass weightSum auch Platz wegnehmen Platz bei Bedarf. Um dies zu testen, setzen Sie weightSum von Ihrem LinearLayout auf 2 und fügen Sie dann android:layout_weight="1" zu jedem der EditText Steuerelemente hinzu. Das Endergebnis wird 50/50 geteilt, wenn die Ansicht geladen wird. Wenn Sie dann mit der Eingabe des ersten Steuerelements beginnen, wird das zweite Leerzeichen entsprechend verkleinert. Wenn Sie dem zweiten Steuerelement Text hinzufügen, wird eine Bildlaufleiste angezeigt.

+0

Hallo. Danke für die Antwort. Im Wesentlichen, in einem Satz, ein gutes Beispiel für das, was ich versuche zu erreichen, sind 3 Textansichten, jeder mit der Größe 1/2 der Bildschirmgröße. Das bedeutet, dass die 2 auf dem Bildschirm erscheint und die dritte nur beim Scrollen erscheint. –

+1

Es gibt keine Möglichkeit, das in reinem XML zu tun; Sie müssten den Bildschirm messen und die Ansichtshöhe im Code festlegen. Ich kann eine Probe für Sie zur Verfügung stellen. –

+0

@sakiskaliakoudas für das Sie setzen möchten layout_height als 0dp und leyout_weight als 0,5 –

3

Sie erklärte Höhe Ihres LinearLayout "match_parent", die seine Eltern Höhe gleich ist. Es wird nie scrollen, solange der Inhalt größer als ScrollView ist. Zuallererst müssen Sie eine feste Höhe wie (50dp) oder wrap_content geben oder Sie müssen seine Höhe programmgesteuert einstellen (wie 2x Bildschirmhöhe, wie Sie erwähnen).

weightSum und weight wird immer zwingen, Ihre Artikel in Ihre aktuelle Größe passen LinearLayouts so versuchen Sie es nicht zu verwenden.

Ich hoffe, das hilft.