Was ich erreichen möchte, ist, dass einige Elemente (Ansichten) a füllen ScrollView. Wenn es 1..3 Elemente gibt, möchte ich sie direkt anzeigen. Bedeutung der ScrollView hat die Höhe von entweder 1, 2 oder 3 Elementen.
Bei 4 oder mehr Artikeln möchte ich die ScrollView aufhören zu expandieren (also a maxHeight) und beginnen Sie mit dem Scrollen.
Allerdings gibt es leider keine Möglichkeit, a einzustellen maxHeight. Also muss ich wohl meine einstellen ScrollView Höhe programmgesteuert entweder WRAP_CONTENT wenn es 1..3 Elemente gibt und stellen Sie die Höhe auf ein 3*sizeOf(View) wenn es 4 oder mehr Artikel gibt.
Kann jemand erklären, warum es keine gibt maxHeight vorausgesetzt, wenn es bereits eine gibt minHeight?
(Übrigens: einige Ansichten, wie ImageView haben eine maxHeight umgesetzt.)
Ich habe eine Lösung in einem anderen Thread gepostet: stackoverflow.com/questions/18425758/…
Das Entfernen von maxHeight durch Google ist ärgerlich und unbequem. Schauen Sie sich all die Dinge an, die Sie jetzt tun müssen, um das gleiche Ergebnis zu erzielen.
– Ian Wambai
28. Februar 17 um 13:46 Uhr
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 erweitert wurde und mit dem Scrollen begann. Ich habe einfach die onMeasure-Methode in ScrollView überschrieben.
Dies funktioniert möglicherweise nicht in allen Situationen, aber es liefert mir auf jeden Fall die für mein Layout erforderlichen Ergebnisse. Und es geht auch auf den Kommentar von madhu ein.
Wenn ein Layout unter der Bildlaufansicht vorhanden ist, funktioniert dieser Trick nicht – madhu 5. März um 4:36 Uhr
Wann würde das nicht funktionieren? Dies scheint eine sehr saubere Lösung zu sein. Ich frage mich, warum sie es nicht in XML implementiert haben.
– Christoph Smet
2. Juni 14 um 6:03 Uhr
Es würde wahrscheinlich nicht funktionieren, wenn Sie die Höhe manuell auf 240 einstellen. Ich habe mir nicht die Mühe gemacht, den Modus zu überprüfen, in dem sich die Bildlaufansicht befindet, da ich nur einen bestimmten Modus (wrap_content) unterstützen musste.
– pfeifen
2. Juni 14 um 23:44 Uhr
Es gibt eine Bearbeitung für diese Antwort, die besagt: “Wenn ein Layout unter der Bildlaufansicht vorhanden ist, funktioniert dieser Trick nicht”, was nicht stimmt. Ich habe ein Layout, das am unteren Rand der Seite ausgerichtet ist, und dieses benutzerdefinierte Layout hat “android:layout_above=’@+…'”, wodurch das benutzerdefinierte Layout immer über dem unteren Layout platziert wird 🙂
– Maschinenstamm
31. Januar 19 um 14:02 Uhr
Um eine zu erstellen ScrollView oder ListView Mit einer maxHeight müssen Sie nur ein transparentes LinearLayout um ihn herum mit einer Höhe erstellen, die der maxHeight entsprechen soll. Dann setzen Sie die Höhe der ScrollView auf wrap_content. Dadurch wird ein ScrollView erstellt, das zu wachsen scheint, bis seine Höhe gleich dem übergeordneten LinearLayout ist.
Dies war nützlich, um zu verhindern, dass sich ein Dialog mit scrollenden Inhalten auf die volle Höhe des Bildschirms ausdehnt.
– Kyle Ivey
5. Dezember 13 um 0:36 Uhr
Ein kleiner Vorschlag wäre, ein FrameLayout anstelle eines LinearLayout zu verwenden, aber ich bezweifle, dass es darauf ankommt.
– Kyle Ivey
5. Dezember 13 um 0:37 Uhr
Wenn unterhalb der Bildlaufansicht ein Layout vorhanden ist, funktioniert dieser Trick nicht
– Shreedhu Madhu
5. März 14 um 4:36 Uhr
kannst du bitte einen Code angeben? bei mir hat es nicht geklappt, vielleicht mache ich was falsch…
– Android-Entwickler
10. April 14 um 08:58 Uhr
funktioniert nicht, wenn Sie Schaltflächen darunter haben. Es wird die Tasten vom Bildschirm drücken
– Li Tian Gong
4. Januar 15 um 23:32 Uhr
Dies hat für mich funktioniert, um es in XML anpassbar zu machen:
MaxHeightScrollView.java:
public class MaxHeightScrollView extends ScrollView {
private int maxHeight;
private final int defaultHeight = 200;
public MaxHeightScrollView(Context context) {
super(context);
}
public MaxHeightScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
if (!isInEditMode()) {
init(context, attrs);
}
}
public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
if (!isInEditMode()) {
init(context, attrs);
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
if (!isInEditMode()) {
init(context, attrs);
}
}
private void init(Context context, AttributeSet attrs) {
if (attrs != null) {
TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
//200 is a defualt value
maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, defaultHeight);
styledAttrs.recycle();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Ich hätte die Antwort von Whizzle kommentiert, wenn ich könnte, hielt es aber für nützlich zu bemerken, dass ich den Code leicht ändern musste, um dieses Problem im Zusammenhang mit dem Mehrfenstermodus in Android N zu lösen:
Dadurch kann die Größe des Layouts kleiner als die maximale Höhe geändert werden, aber auch verhindert werden, dass es größer als die maximale Höhe wird. Ich habe dies verwendet, ist eine Layoutklasse, die überschreibt RelativeLayout und dies erlaubte mir, einen benutzerdefinierten Dialog mit a zu erstellen ScrollView als Kind von MaxHeightRelativeLayout das nicht die volle Höhe des Bildschirms erweitert und auch schrumpft, um in die kleinste Fenstergröße in Multi-Window für Android N zu passen.
xionghg
Wie oben erwähnt, bietet ConstraintLayout seinen Kindern maximale Höhe über:
Außerdem, wenn die maximale Höhe für ein ConstraintLayout-Kind ungewiss ist, bis die App ausgeführt wird, gibt es immer noch eine Möglichkeit, dieses Kind automatisch an eine veränderliche Höhe anzupassen, unabhängig davon, wo es in der vertikalen Kette platziert wurde.
Zum Beispiel müssen wir einen unteren Dialog mit einer änderbaren Kopfzeilen-TextView, einer änderbaren ScrollView und einer änderbaren Fußzeilen-TextView anzeigen. Die maximale Höhe des Dialogfelds beträgt 320 dp. Wenn die Gesamthöhe 320 dp nicht erreicht, fungiert ScrollView als wrap_content, wenn die Gesamthöhe ScrollView überschreitet, agiert es als „maxHeight=320 dp – Kopfzeilenhöhe – Fußzeilenhöhe“.
Wir können dies nur durch eine XML-Layoutdatei erreichen:
// if the scrollView already has a layoutParams:
scrollView.getLayoutParams().height = heightOfItem * numberOfItens;
// or
// if the layoutParams is null, then create a new one.
scrollView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, heightOfItem * numberOfItens));
.
5938600cookie-checkAndroid: Warum gibt es keine maxHeight für eine Ansicht?yes
Ich habe eine Lösung in einem anderen Thread gepostet: stackoverflow.com/questions/18425758/…
– JMPergar
5. November 14 um 13:45 Uhr
Ich habe eine Lösung dafür unter erstellt chintanrathod.com/…
– Chintan Rathod
28. April 15 um 6:20 Uhr
Das Entfernen von maxHeight durch Google ist ärgerlich und unbequem. Schauen Sie sich all die Dinge an, die Sie jetzt tun müssen, um das gleiche Ergebnis zu erzielen.
– Ian Wambai
28. Februar 17 um 13:46 Uhr