Ansichten haben eine,minHeight
aber irgendwie fehlt eine maxHeight
:
Was ich erreichen möchte, ist, dass einige Elemente (Ansichten) a ausfüllen ScrollView
. Wenn es 1..3 Elemente gibt, möchte ich sie direkt anzeigen. Das heißt, die ScrollView
hat die Höhe von entweder 1, 2 oder 3 Elementen.
Wenn es 4 oder mehr Elemente gibt, möchte ich, dass das nicht ScrollView
mehr erweitert wird (also a maxHeight
) und mit dem Scrollen beginnt.
Es gibt jedoch leider keine Möglichkeit, eine zu setzen maxHeight
. Daher muss ich meine ScrollView
Höhe wahrscheinlich programmgesteuert entweder auf WRAP_CONTENT
1..3 Elemente und auf 3*sizeOf(View)
4 oder mehr Elemente einstellen .
Kann mir jemand erklären, warum es keine gibt maxHeight
, wenn es schon eine gibt minHeight
?
(Übrigens: Einige Ansichten ImageView
haben eine maxHeight
implementiert.)
Antworten:
Keine dieser Lösungen funktionierte für das, was ich brauchte, nämlich eine ScrollView, die auf wrap_content gesetzt war, aber eine maxHeight hatte, sodass sie nach einem bestimmten Punkt nicht mehr expandierte und mit dem Scrollen begann. Ich habe einfach die onMeasure-Methode in ScrollView überschrieben.
Dies funktioniert möglicherweise nicht in allen Situationen, gibt mir aber mit Sicherheit die für mein Layout erforderlichen Ergebnisse. Und es geht auch auf den Kommentar von Madhu ein.
quelle
Um ein
ScrollView
oderListView
mit einem maxHeight zu erstellen, müssen Sie nur ein transparentes lineares Layout mit einer Höhe erstellen, die der Höhe entspricht, die das maxHeight haben soll. Anschließend setzen Sie die Höhe von ScrollView aufwrap_content
. Dadurch wird eine ScrollView erstellt, die scheinbar wächst, bis ihre Höhe dem übergeordneten LinearLayout entspricht.quelle
Dies funktionierte für mich, um es in XML anpassbar zu machen:
MaxHeightScrollView.java:
attr.xml
Beispiellayout
quelle
(Ich weiß, dass dies die Frage nicht direkt beantwortet, aber für andere hilfreich sein kann, die nach maxHeight-Funktionalität suchen.)
ConstraintLayout bietet seinen Kindern maximale Körpergröße über
oder
Beispielnutzung hier .
quelle
Ich hätte die Antwort von whizzle kommentiert, wenn ich könnte, fand es aber nützlich zu bemerken, dass ich den Code geringfügig ändern musste, um dieses Problem im Kontext des Mehrfenstermodus in Android N zu lösen:
Dadurch kann die Größe des Layouts kleiner als die maximale Höhe sein, aber auch verhindert werden, dass es größer als die maximale Höhe ist. Ich habe diese Layoutklasse verwendet, die überschrieben wird. Dadurch
RelativeLayout
konnte ich einen benutzerdefinierten Dialog mit einemScrollView
als untergeordnetem Dialogfeld erstellenMaxHeightRelativeLayout
, das nicht die gesamte Bildschirmhöhe erweitert und auch verkleinert wird, um in die kleinste Witwengröße in Multi-Window für Android zu passen N.quelle
Es gibt keine Möglichkeit, maxHeight einzustellen. Sie können jedoch die Höhe einstellen.
Dazu müssen Sie die Höhe jedes Elements Ihrer scrollView ermitteln. Danach setzen Sie einfach Ihre scrollView-Höhe auf numberOfItens * heightOfItem.
Um die Höhe eines Gegenstands zu ermitteln, gehen Sie wie folgt vor:
So stellen Sie die Höhe ein:
quelle
Wickeln Sie
ScrollView
Ihre EbeneLinearLayout
mit layout_height = "max_height" um Ihre Ebene , dies wird einen perfekten Job machen. Tatsächlich habe ich diesen Code in der Produktion der letzten 5 Jahre ohne Probleme.quelle
Meine
MaxHeightScrollView
benutzerdefinierte Ansichtstyle.xml
Verwenden von
quelle
Ich habe hier eine Antwort:
https://stackoverflow.com/a/29178364/1148784
Erstellen Sie einfach eine neue Klasse, die ScrollView erweitert, und überschreiben Sie die
onMeasure
Methode.quelle
Wie oben erwähnt, bietet ConstraintLayout seinen Kindern maximale Körpergröße über:
Wenn die maximale Höhe für ein Kind von ConstraintLayout bis zur Ausführung der App ungewiss ist, kann dieses Kind außerdem automatisch eine veränderbare Höhe anpassen, unabhängig davon, wo es in der vertikalen Kette platziert wurde.
Zum Beispiel müssen wir einen unteren Dialog mit einer veränderlichen Kopfzeile TextView, einer veränderlichen ScrollView und einer veränderlichen Fußzeile TextView anzeigen. Die maximale Höhe des Dialogfelds beträgt 320 dp ,, wenn die Gesamthöhe 320 dp nicht erreicht. ScrollView fungiert als wrap_content, wenn die Gesamthöhe ScrollView überschreitet, fungiert als "maxHeight = 320 dp - Kopfzeilenhöhe - Fußzeilenhöhe".
Wir können dies nur durch eine XML-Layoutdatei erreichen:
Der meiste Importcode ist kurz:
Die horizontale maxWidth-Nutzung ist ziemlich gleich.
quelle
Haben Sie versucht, den Wert layout_weight zu verwenden ? ? Wenn Sie einen Wert größer als 0 festlegen, wird diese Ansicht auf den verbleibenden verfügbaren Speicherplatz ausgedehnt.
Wenn Sie mehrere Ansichten hatten, die gestreckt werden mussten, wird der Wert zu einem Gewicht zwischen ihnen.
Wenn Sie also zwei Ansichten auf den Wert layout_weight von 1 gesetzt hätten, würden sich beide dehnen, um den Raum auszufüllen, aber beide würden sich auf den gleichen Raum erstrecken. Wenn Sie einen von ihnen auf den Wert 2 setzen, wird er doppelt so stark gedehnt wie die andere Ansicht.
Weitere Informationen finden Sie hier unter Lineares Layout.
quelle
maxHeight
den ich auf einen bestimmten Eintauchwert einstellen kann. (Ich endete schließlich damit, die Höhen programmgesteuert zu berechnen und einzustellen)Ich denke, Sie können die Höhe zur Laufzeit nur für 1 Element einstellen
scrollView.setHeight(200px)
, für 2 ElementescrollView.setheight(400px)
für 3 oder mehrscrollView.setHeight(600px)
quelle
Wie wir wissen, können Geräte mit Android unterschiedliche Bildschirmgrößen haben. Wie wir weiter wissen, sollten sich Ansichten dynamisch anpassen und zum geeigneten Raum werden.
Wenn Sie eine maximale Höhe festlegen, erzwingen Sie möglicherweise, dass die Ansicht nicht genügend Platz erhält oder weniger Platz benötigt. Ich weiß, dass es manchmal praktisch zu sein scheint, eine maximale Höhe einzustellen. Wenn sich die Auflösung jedoch jemals dramatisch ändern wird und dies auch!, Wird die Ansicht mit maximaler Höhe nicht angemessen aussehen.
Ich denke, es gibt keinen richtigen Weg, um genau das Layout zu machen, das Sie wollen. Ich würde Ihnen empfehlen, Ihr Layout mithilfe von Layout-Managern und relativen Mechanismen zu überdenken. Ich weiß nicht, was Sie erreichen wollen, aber es klingt für mich etwas seltsam, dass eine Liste nur drei Elemente enthalten sollte und der Benutzer dann scrollen muss.
Übrigens. minHeight ist nicht garantiert (und sollte vielleicht auch nicht existieren). Es kann einen gewissen Vorteil haben, die Sichtbarkeit von Elementen zu erzwingen, während andere relative Elemente kleiner werden.
quelle
Wenn jemand erwägt, einen genauen Wert für LayoutParams zu verwenden, z
Denken Sie daran, die Dichte der Geräteanzeige zu berücksichtigen, da sonst auf verschiedenen Geräten ein sehr merkwürdiges Verhalten auftreten kann. Z.B:
quelle
Ermitteln Sie zuerst die Elementhöhe in Pixel
dann einfach
quelle
Wenn ihr eine nicht überlaufende Bildlauf- oder Listenansicht erstellen wollt, aber nur in einem RelativeLayout mit einer Draufsicht und einer Unteransicht oben und unten dafür:
quelle
Ich habe eine benutzerdefinierte ScrollView aus Kotlin verwendet, die verwendet
maxHeight
. Anwendungsbeispiel:Hier ist der Code von
ScrollViewWidthMaxHeight
:das braucht auch diese Erklärung in
values/attrs.xml
:quelle