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?

dev_android
quelle

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.

Dalmas
quelle
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));
Eric Nordvik
quelle
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);
Rakshi
quelle
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
Gundrabur
quelle
4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

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

Ujjwal
quelle
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.

Morgan Wilde
quelle