Ich möchte einen Button unter einer ListView
anzeigen. Problem ist, wenn die ListView
erweitert wird (Elemente hinzugefügt ...), wird die Schaltfläche aus dem Bildschirm gedrückt.
Ich habe eine LinearLayout
mit Gewichten ausprobiert (wie in Android vorgeschlagen: Warum gibt es kein maxHeight für eine Ansicht? ), aber entweder habe ich die Gewichte falsch verstanden oder es hat einfach nicht funktioniert.
Außerdem habe ich irgendwo den Hinweis gefunden, eine RelativeLayout
zu verwenden. Die Variable ListView
würde dann mit dem Parameter Android:layout_above
über der Schaltfläche gesetzt.
Das Problem dabei ist, dass ich nicht weiß, wie ich den Knopf danach positionieren soll. In dem Beispiel, das ich gefunden habe, wurde die Ansicht unter der ListView
mit Android:layout_alignParentBottom
angepasst, aber ich möchte nicht, dass meine Schaltfläche am unteren Rand des Bildschirms haftet.
Irgendwelche Ideen außer der Verwendung der setHeight-Methode und der Berechnung des Platzbedarfs?
Edit: Ich habe viele nützliche Antworten erhalten.
die Lösung von bigstone & user639183 fast hat perfekt funktioniert. Ich musste jedoch eine zusätzliche Polsterung/Rand an der Unterseite der Schaltfläche hinzufügen, da sie immer noch halb aus dem Bildschirm gedrückt werden würde (dann aber angehalten wurde).
Adinias Antwort mit dem relativen Layout ist gut, wenn Sie möchten, dass die Schaltfläche am unteren Rand des Bildschirms angezeigt wird. Es ist nicht das, was ich beabsichtigt habe, es könnte aber für andere nützlich sein.
Die Lösung von AngeloS war die, die ich am Ende gewählt habe, da sie gerade die gewünschten Effekte erzeugt hat. Ich habe jedoch zwei kleine Änderungen an der LinearLayout
um den Button vorgenommen:
Da ich in meinem Layout keine absoluten Werte haben wollte, änderte ich Android:layout_height="45px"
in wrap_content
, was ebenfalls gut funktioniert.
Zweitens, da ich wollte, dass der Button horizontal zentriert wird, was nur von verticalLinearLayout
unterstützt wird, habe ich Android geändert: Orientierung = "horizontal" in "vertikal".
AngeloS erklärte auch in seinem ersten Beitrag, dass er nicht sicher sei, ob der Android:layout_weight="0.1"
-Parameter in der LinearLayout
um die ListView
eine Wirkung hatte; Ich habe es gerade ausprobiert und tut es auch! Ohne wird die Taste wieder aus dem Bildschirm gedrückt.
Ich hatte genau dieses Problem und um das Problem zu lösen, habe ich zwei getrennte LinearLayouts
erstellt, in denen jeweils ListView
und Button
untergebracht sind. Von dort füge ich beide in einen anderen Linear Layout
ein und setze Android:orientation
dieses Containers auf vertical
. Ich habe auch die Gewichtung von LinearLayout
, der ListView
enthielt, auf 0.1
eingestellt. Von dort aus können Sie die Höhe des unteren Containers (mit der Schaltfläche) auf die gewünschte Höhe einstellen.
EDITdas meine ich:
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical">
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0.1"
>
<ListView Android:id="@+id/ListView01"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent"
Android:dividerHeight="2px">
</ListView>
</LinearLayout>
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="45px"
Android:background="@drawable/drawable"
>
<Button Android:background="@drawable/btn_more2"
Android:id="@+id/moreButton"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_alignParentRight="true"
Android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
Die obige Lösung fixiert die Schaltfläche am unteren Rand des Bildschirms.
Ändern Sie die Höhe von ListView01
in wrap_content
, damit die Schaltfläche am unteren Rand der Liste angezeigt wird:
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0.1"
>
<ListView Android:id="@+id/ListView01"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:dividerHeight="2px">
</ListView>
</LinearLayout>
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="45px"
Android:background="@drawable/drawable"
>
<Button Android:background="@drawable/btn_more2"
Android:id="@+id/moreButton"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_alignParentRight="true"
Android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
Ich habe dieses Problem im Code gelöst und die Höhe der Listenansicht nur festgelegt, wenn mehr als 5 Elemente enthalten sind:
if(adapter.getCount() > 5){
View item = adapter.getView(0, null, listView);
item.measure(0, 0);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, (int) (5.5 * item.getMeasuredHeight()));
listView.setLayoutParams(params);
}
Beachten Sie, dass ich die maximale Höhe auf das 5,5-fache der Höhe eines einzelnen Elements festgelegt habe, sodass der Benutzer sicher ist, dass ein Bildlauf erforderlich ist. :)
Bei Ihrer letzten Bearbeitung müssen Sie lediglich Android:layout_above="@+id/butt1"
in Ihren ListView-Code einfügen.
Und um Ihnen (und allen, die zuvor eine Antwort versucht haben) zu zeigen, dass Sie wirklich nicht mehr als eine RelativeLayout
verwenden müssen, ist hier Ihr korrigierter Code :
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="@drawable/bkg">
<TextView
Android:id="@+id/textView1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="TextView1"
Android:layout_alignParentTop="true">
</TextView>
<TextView
Android:id="@+id/textView2"
Android:layout_below="@+id/textView1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="TextView2"
Android:layout_centerHorizontal="true">
</TextView>
<Button
Android:id="@+id/butt1"
Android:text="string/string3"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_alignParentBottom="true">
</Button>
<ListView
Android:id="@+id/Android:list"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="2dip"
Android:layout_marginBottom="2dip"
Android:drawSelectorOnTop="false"
Android:visibility="visible"
Android:layout_below="@+id/textView2"
Android:layout_above="@+id/butt1" />
</RelativeLayout>
und das Ergebnis mit einer zufälligen Liste:
Stellen Sie mit LinearLayout
die Höhe Ihrer ListView
und Button
auf wrap_content
ein und fügen Sie ListView
ein Gewicht = 1 hinzu. Dies sollte so funktionieren, wie Sie möchten.
.__ und ja, setzen Sie den layout_gravity
der Button
auf bottom
RelativeLayout
ist eine Lösung. Wenn Sie nicht möchten, dass die Schaltfläche zu nahe am unteren Rand bleibt, können Sie Ränder hinzufügen (durch Auffüllen einer Schaltfläche würde die Taste beschädigt, da sie einen Hintergrund mit 9 Patches verwendet und ihre eigene Auffüllung festgelegt wird).
Das Gleiche wäre, wenn Sie eine LinearLayout
verwenden würden: Sie erreichen die gewünschte Variable, indem Sie die ListView
auf eine Höhe = 0 und ein Gewicht von 1 setzen, und für die Schaltfläche height = wrap_content und weight = 0. (Wenn Sie beides auf wrap_content setzen, würde, wie der Benutzer639183 sagte, die Höhe von ListView
nicht begrenzt).
Es wurde ein Weg gefunden, dies ohne geschachtelte Container zu tun, inspiriert von der AngeloS-Lösung.
Ich habe eine LinearLayout
mit vertikaler Ausrichtung verwendet, die eine ListView
und eine Schaltfläche hat. Ich habe den Android:layout_weight="0.1"
für ListView
eingestellt.
Es gelingt, den Knopf immer an der Unterseite der Liste zu platzieren. Die Schaltfläche wird nicht vom Bildschirm gedrückt, wenn die Liste wächst.
<ListView
Android:id="@+id/notes_list"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0.1"
/>
<Button
Android:id="@+id/create_note_btn"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="onCreateButtonClicked"
Android:text="@string/create_notes"
/>
Dies ist der sauberste Weg, dies zu tun:
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<ListView
Android:id="@+id/ListView01"
Android:layout_width="fill_parent"
Android:layout_height="0dp"
Android:layout_weight="1"
Android:dividerHeight="2px">
</ListView>
<FrameLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/drawable"
>
<Button Android:background="@drawable/btn_more2"
Android:id="@+id/moreButton"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentRight="true"
Android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
Es ist der Lösung von Angelos ähnlich, aber Sie benötigen nicht das lineare Layout, das die ListView zusammenfasst. Sie können auch ein FrameLayout verwenden, das im Vergleich zu einem LinearLayout leichter ist, um die Schaltfläche zusammenzufassen.
Sie können dies wahrscheinlich mit verschachtelten Containern durchführen. Möglicherweise müssen Sie den Button in einen zweiten (inneren) Container einwickeln, um mehr Platz zu beanspruchen, und den Button an der Oberseite des inneren Containers ausrichten.
Möglicherweise so etwas:
RelativesLayout
-- Listenansicht
- RelativesLayout
---- Taste
Mit den verschiedenen Ausrichtungsoptionen der beiden Container sollten Sie dies in die Lage versetzen.
Die Idee wird in den sehr guten Lösungen umrissen durch:
Beide scheinen zumindest auf v4.4.3 perfekt zu funktionieren.
Ich musste noch etwas Zeit damit verbringen, Testcode zu schreiben, um die Methode zu überprüfen und zu bestätigen. Unten ist der eigenständige, minimale Testcode erforderlich.
Das Layout basiert auf der Lösung von Sparkle, da es weniger verschachtelte Layouts enthält. Es wurde auch aktualisiert, um die aktuellen LINT-Prüfungen anzuzeigen.
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
tools:context="MainActivity" >
<ListView
Android:id="@+id/listview"
Android:layout_width="fill_parent"
Android:layout_height="0dp"
Android:layout_weight="1" />
<Button
Android:id="@+id/btn"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="Grow List"
tools:ignore="HardcodedText" />
</LinearLayout>
Activity stellt den Boilerplate-Code bereit, um die Lösung für sich selbst zu testen.
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listview = (ListView)findViewById(R.id.listview);
final ArrayAdapter<String> adapter =
new ArrayAdapter<String>(this,
Android.R.layout.simple_list_item_1,
new ArrayList<String>());
adapter.setNotifyOnChange(true);
listview.setAdapter(adapter);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
int count = adapter.getCount();
adapter.add(String.valueOf(count));
listview.setSelection(count);
}
});
}
}
Fühlen Sie sich frei, hinzuzufügen oder zu verbessern, da dies "Community-Wiki" ist.
Versuchen Sie, RelativeLayout mit der Schaltfläche unten zu verwenden. Legen Sie die Höhe des Layouts als "wrap_content" ..__ fest. Ich habe es nicht probiert. Nur eine Idee
fügen Sie in LinearLayout einfach Android:layout_weight="1"
zu Ihrer ListView hinzu
Folgendes ist was für mich gearbeitet hat ...
if(adapter.getCount() > 3){
View item = adapter.getView(0, null, impDateListView);
item.measure(0, 0);
LayoutParams params = impDateListView.getLayoutParams();
params.width = LayoutParams.MATCH_PARENT;
params.height = 3 * item.getMeasuredHeight();
impDateListView.setLayoutParams(params);
}
Hinweis: Die params.width = ... muss ebenfalls gesetzt werden ...
Das obige Beispiel ist, wenn Sie TableRow und ListView in TableRow verwenden.
inhalt in lineares Layout umschließen
in der Listenansicht hinzufügen: Android: layout_weight = "1"
stellen Sie in Ihrem Button eine feste Höhe ein
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<ListView
Android:id="@+id/my_list"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_weight="1">
</ListView>
<Button
Android:text="Button"
Android:layout_width="match_parent"
Android:layout_height="50dp"/>
</LinearLayout>
Wenn Sie möchten, dass der Inhalt unter der Listenansicht nach unten verschoben wird, wenn der Liste Elemente hinzugefügt werden, versuchen Sie diese Lösung:
Fügen Sie am unteren Rand der Listenansicht eine positive Auffüllung und oben in der Fußzeile eine negative Auffüllung hinzu. Dies funktioniert in einem linearen Layout oder in einem relativen Layout.
<ListView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="50dp"/>
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="-50dp"/>