Attribute setzen in einem dynamischen Layout

  • Antworten:12
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 602

04.12.2022, 18:26:06 via Website

Hallo zusammen

Ich möchte in meiner App das Layout dynamisch aufbauen. Dabei verwende ich TextViews. Ich habe vier TextViews neben einander. Darum möchte ich die folgenden Attribute wie folgt setzen

layout_width="0dp"
layout_weight="1"

Wie macht man so was.

 var txt_feld1 : TextView? = null
    txt_feld1?.setText("Name")
    txt_feld1?.setTextSize(16f)
    txt_feld1?.setOnClickListener {

    }

Einige Attribute konnte ich setzen. Aber die anderen kriege ich einfach nicht hin. Kann man die überhaupt im Code definieren?

Gruss Renato

Kommentieren
Beste Antwort
koje71
  • Forum-Beiträge: 56

11.01.2023, 11:53:28 via Website

zu "with": Für alles innerhalb der geschweiften Klammern ist "this" das "Objekt" in den runden Klammern. Damit brauche ich für Methoden wie setText oder setColor nicht jedes mal den Namen des Zielobjekts davor zu schreiben (der steht ja in den runden Klammern). Es sieht etwas schöner aus aber es geht auch ohne "with".

Viele Grüße

Hilfreich?
Robbiani Renato
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 602

05.12.2022, 21:11:54 via Website

Ciao Rafael

Herzlichen Dank für deine Antwort. Mit der Zeile

var txt_feld1 : TextView? = null

Lege ich ein neues Objekt an und initialisiere es auch gleich. Mache ich da was Falsch?

Gruss Renato

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 602

05.12.2022, 21:41:33 via Website

Hallo zusammen

Funktioniert diese Lösung?

var txt_feld1 : TextView? = null
    var params : LinearLayout.LayoutParams? = null
    params?.width = 0
    params?.weight = 1f
    txt_feld1?.setText("Name")
    txt_feld1?.setTextSize(16f)
    txt_feld1?.layoutParams = params
    txt_feld1?.setOnClickListener {

    }

Gruss Renato

Hilfreich?
Kommentieren
Rafael K.
  • Forum-Beiträge: 2.359

06.12.2022, 07:37:23 via Website

null ist ein Zeiger auf nichts.
Du legst dadurch kein neuen Objekt an, sondern eine Variable, die auf nichts zeigt.
Entsprechend empfängt auch nichts die Funktionsaufrufe, die du machst.
Ein neues Objekt legt man an, indem man den Konstruktor der Klasse aufruft.

Hilfreich?
Jokelswa00
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

06.12.2022, 10:23:21 via Website

Hallo und selbst wenn du ein Objekt erstellt hast musst du die neue View auch in das actuelke Layout einfügen.
Sonst siehst du nichts auf dem Bildschirm.

Hilfreich?
Kommentieren
koje71
  • Forum-Beiträge: 56

08.12.2022, 13:37:07 via Website

So geht es auch (hab's auch getestet):

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val layout = LinearLayout(this)
    layout.orientation = LinearLayout.HORIZONTAL
    addTextField(layout,"text-1")
    addTextField(layout,"text-2")
    addTextField(layout,"text-3")
    addTextField(layout,"text-4")
    setContentView(layout)
}

private fun addTextField(target:LinearLayout, text:String){
    with(TextView(this)){
        target.addView(this)
        setText(text)
        with(getLayoutParams() as LinearLayout.LayoutParams){
            width = 0
            weight = 1f
        }
    }
}

}

Wichtig ist dass der TextView schon dem LinearLayout hinzugefügt wurde, erst dann bekommt der TextView seine LayoutParams und es kann width und weight gesetzt werden.

— geändert am 09.12.2022, 11:07:47

Hilfreich?
Robbiani Renato
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 602

10.12.2022, 21:29:55 via Website

Herzlichen Dank allen die mir da weitergeholfen haben.

Gruss Renato

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 602

19.12.2022, 20:40:14 via Website

Ciao koje71

Ich verstehe dein Code nicht ganz. Was ist die Methode "with"? Was macht die?

Gruss Renato

Hilfreich?
Kommentieren
Rafael K.
  • Forum-Beiträge: 2.359

20.12.2022, 07:37:27 via Website

https://stackoverflow.com/questions/45873205/what-does-with-mean-in-kotlin

Hier ein Beispiel

Zu dem Code oben. Ich würde das als Extension auf LinearLayout machen. Dann ist der Aufruf einen Parameter kürzer:

private fun LinearLayout.addTextField(text: String) {
    with(TextView(context)) {
        addView(this)
        setText(text)
        with(layoutParams as LinearLayout.LayoutParams) {
            width = 0
            weight = 1f
        }
    }
}

— geändert am 20.12.2022, 07:40:49

Hilfreich?
koje71
Kommentieren
Beste Antwort
koje71
  • Forum-Beiträge: 56

11.01.2023, 11:53:28 via Website

zu "with": Für alles innerhalb der geschweiften Klammern ist "this" das "Objekt" in den runden Klammern. Damit brauche ich für Methoden wie setText oder setColor nicht jedes mal den Namen des Zielobjekts davor zu schreiben (der steht ja in den runden Klammern). Es sieht etwas schöner aus aber es geht auch ohne "with".

Viele Grüße

Hilfreich?
Robbiani Renato
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

12.01.2023, 11:34:00 via Website

Ja du hast eine Variable erstellt aber kein Objekt.
Null ist kein Objekt ist halt nichts

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 602

12.01.2023, 17:14:54 via Website

Hallo zusammen

Ich habe es jetzt hin gekriegt. Es läuft nun.
Herzlichen Dank allen die mir geholfen haben.

Gruss Renato

Hilfreich?
Kommentieren