Android legt Höhe und Breite der benutzerdefinierten Ansicht programmgesteuert fest


128

Ich habe eine benutzerdefinierte Ansicht mit dem Namen erstellt Graphview. Hier ist die Struktur für die GraphView-Klasse.

public class GraphView extends View {

    public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
        super(context);
                ........
   }

   ..................
   .................
}

Ich habe die Ansicht in einem Tablerow mit hinzugefügt addview(). Es funktioniert gut. Jetzt möchte ich Höhe und Breite für die einstellen GraphView. Wie geht das?

Antworten:


138

Der einfache Weg ist, die Größe programmgesteuert so einzustellen:

graphView.setLayoutParams(new LayoutParams(width, height));

Dies ist in Ordnung, wenn Sie die genaue Größe der Ansicht kennen. Wenn Sie jedoch einen flexibleren Ansatz wünschen, können Sie die onMeasure()Methode überschreiben , um die Ansicht in Abhängigkeit vom verfügbaren Speicherplatz und den Layoutbeschränkungen genauer zu messen ( wrap_content,match_parent oder einer festen Größe).

Ein Beispiel zum Überschreiben finden Sie onMeasure()in den Android-Dokumenten und im LabelViewBeispiel in Ihrem SDK-Verzeichnis.


16
Es wäre hilfreich zu wissen, welche LayoutParams Sie dort importieren.
— user3690202

1
Das LayoutParamssollte aus dem Layout stammen, in dem graphViewdas platziert ist. Wenn sich beispielsweise die XML-Layoutdatei darin graphViewbefindet RelativeLayout, sollten Sienew RelativeLayout.LayoutParams(width, height)
— Vic

208

Sie können Höhe und Breite folgendermaßen einstellen:

myGraphView.setLayoutParams(new LayoutParams(width, height));

76
Sie sollten sicherstellen, dass die von Ihnen verwendete LayoutParam-Klasse aus der richtigen übergeordneten Layout-Klasse stammt. Wenn Ihre GraphView beispielsweise in einem LinearLayout enthalten ist, müssen Sie die Klasse LinearLayout.LayoutParams verwenden.
— Yincrash

41
Dies funktioniert auch und stellt sicher, dass Sie die richtige LayoutParams-Klasse verwenden: einfach tun myGraphView.getLayoutParams().height = 100;.
— Sulai

21
Wenn Sie dies tun this.getLayoutParams().height = 100, stellen Sie sicher, dass Sie es befolgen this.setLayoutParams(this.getLayoutParams()), sonst wird es nichts tun (nützlich).
— Achal Dave

4
Ich finde es seltsam, dass diese Antwort mehr Punkte bringt. Während es einfacher ist, ist es viel weniger modular; Wenn Sie Ihre Ansicht an einem anderen Ort verwenden möchten, müssen Sie diese Werte für Breite / Höhe auch dort fest codieren. Seien Sie vorsichtig damit.
— Gardarh

1
Vielen Dank an @yincrash für den Hinweis. Es scheint seltsam, dass ich die Klasse der übergeordneten Ansicht (in meinem Fall RelativeLayout) anstelle der übergeordneten Klasse meiner benutzerdefinierten Ansicht (in meinem Fall
— SurfaceView

75

Sie können die Höhe und Breite einer Ansicht in einem relativen Layout wie diesem festlegen

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);

2
Sie müssen layoutparam nicht erneut einstellen. Es wird automatisch reflektiert. Dies ist der Vorteil eines objektorientierten Ansatzes.
— Dipendra

8
@Dipendra der Aufruf an setLayoutParams()ist erforderlich, weil es andere Methoden wie resolveLayoutParams()undrequestLayout()
— William

Ausnahme wie in onCreate zu geben getLayoutParams () ist Nullwert. So params.height Ursache Ausnahme
— Sibasish

Sie sollten sich auf die Ansicht beziehen, für die Sie die Höhe einstellen müssen. Überprüfen Sie, ob Sie auf dieselbe Ansicht zeigen
— Rakshi

1
Wenn Sie die layoutParamsInitiierung einer Ansicht erhalten, handelt es sich um eine NPE. Erklären Sie bitte, an welchem ​​Punkt Sie dies ausführen.
— John Sardinha

6

Auf Kotlin können Sie Breite und Höhe jeder Ansicht direkt mithilfe ihrer virtuellen Eigenschaften festlegen:

someView.layoutParams.width = 100
someView.layoutParams.height = 200

4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12ist dein Spinner und 200 , 120 ist widthund heightfür dich spinner.


3

Dies ist eine Kotlin-basierte Version, vorausgesetzt, die übergeordnete Ansicht ist eine Instanz von LinearLayout.

someView.layoutParams = LinearLayout.LayoutParams(100, 200)

Dies ermöglicht das Einstellen der Breite und Höhe ( 100und 200) in einer einzelnen Zeile.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.