Init Wert?

R

RalfKahl

Neues Mitglied
5
Hallo zusammen,

was ist für solch eine Variable der Init-Wert?
var StandG : TextView = ?
Bisher mache ich es so, dass ich mit findViewById irgendein Textview der App abgreife.
Da ich das aber für mehrere Werte machen muss gehe ich derzeit so vor:
// zum Initialisieren
var StandG : TextView = findViewById<TextView>(R.id.textNaechstesZiel)
var StandE : TextView = StandG
var StandT : TextView = StandG
var StandD : TextView = StandG
var Score : TextView = StandG

when (aktS) {
1 -> {
StandG = findViewById<TextView>(R.id.sStandG1)
StandE = findViewById<TextView>(R.id.sStandE1)
StandT = findViewById<TextView>(R.id.sStandT1)
StandD = findViewById<TextView>(R.id.sStandD1)
Score = findViewById<TextView>(R.id.sScore1)

scoreUebernahme(Wert)
}
2 -> {
.... bis
6 ->
}
StandG.text = gScore[aktS].toString()
StandE.text = eScore[aktS][0].toString()
StandT.text = tScore[aktS][0].toString()
StandD.text = dScore[aktS][0].toString()
Score.hint = aktScore.text
Score.text = ""


Ich mache das so, da ich eine Zeile einer Tabelle(6 Zeilen mit 5 Spalten) von der activity abgreifen und neu belegen möchte.
So habe ich nur 5 Variable, mit denen ich dann arbeite bevor ich sie wieder auf die activity zurückschreibe.
Wenn ich die Variable ohne Initialwert anlege geht das auch nicht. Ich benötige einen Initialwert.

Schön bzw einfacher wäre es natürlich wenn ich die Textview auf der activity als Array anlegen könnte, aber das geht wohl nicht.

Danke Ralf
 
Du brauchst nicht einen init Wert.
Du brauchst oder host dir mit findViewById die Instanz das Objekt von dem Textview.
Das in deiner when ist totaler mist.
 
Durch das, dass ich hier so arbeite, spare ich mir die 6 Statements in jedem when, die ich derzeit nach dem letzten when stehen habe. Ich habe hier also 30 Zeilen wiederholenden Code gespart.
Leider ist es so, dass wenn ich im when das Statement so schreibe:
var StandG : TextView = findViewById<TextView>(R.id.sStandG1)
var StandE : TextView = findViewById<TextView>(R.id.sStandE1)
usw
dann kennt er diesen Wert nur innerhalb des when und ich muss diese 6 Statements überall mit rein nehmen. Und bei Anpassungen immer 6 Stellen anpassen.
Also ich finde das nicht als so einen totalen Mist.

Theoretisch kann ich es auch so machen
val Stand = arrayOfNulls<TextView>(5)
when (aktS) {
1 -> {
Stand[0] = findViewById<TextView>(R.id.sStandG1)
Stand[1] = findViewById<TextView>(R.id.sStandE1)
usw
Das funktioniert. Aber ich habe hier nicht die sprechenden Namen wie im derzeitigen Versuch.

Da ich in der App sehr viel mit vielen und auch großen Tabellen arbeite, suche ich derzeit nach der besten Möglichkeit Code zu sparen.
 
Aber ich habe hier nicht die sprechenden Namen wie im derzeitigen Versuch.
setId() & getId()
View | Android Developers



Grundsätzlich :
Da ich in der App sehr viel mit vielen und auch großen Tabellen arbeite, suche ich derzeit nach der besten Möglichkeit Code zu sparen.

Deine Vorgehensweise ist für eine Android UI dann bei der angedachten ElementenAnzahl eher "ungewöhnlich", resourcenaufwendig und werden mit an Sicherheit grenzender Wahrscheinlichkeit ein FrameSkipping verursachen.
Da sollten für die Performance die Anzahl der Codezeilen eher eine zweite Rolle spielen.

Daher :
Benutze einen RecyclerView mit Adapter - Dafür ist er gedacht.
Dynamische Listen mit RecyclerView erstellen | Views | Android Developers



Aber wenn Du es unbedingt krampfhaft zu Fuß umsetzen möchtest : (Jedem das Seine)

Erstelle dynamisch zur Laufzeit deine Views und füge sie mit addView dem Container hinzu.

Bsp in Java mit CustomView: (RalphsTileView mit Layout und Setter)
Code:
private RalphsTileView addTile (ViewGroup container, ........)
{
 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT, // Width
                LinearLayout.LayoutParams.MATCH_PARENT, // Height
                1.0f // Weight );

        RalphsTileView ka = new RalphsTileView (mContext);
        ka.setData(.......);
        ka.setLayoutParams(layoutParams);
        container.addView(ka);
        return ka;
}

Code:
// init
ArraList<RalphsTileView> list = new ArrayList();
for (int i = 0; i< 100; i++)
   list.add(addTile(container,........);
 
// ändern an pos 5
list.get(4).setData (.........);

// löschen an pos 5
list.remove(4);
container.removeViewAt(4);

// sortieren der list mit Collection

- Die List-Loop in einem separaten Core-Thread.
- Update des containers im UI-Thread.


Fazit :
Das Ganze ist mehr Aufwand und verwaltet keine dynamische Speicherverwaltung.
Dazu ist allerdings der RecyclerView eher in der Lage.
 
Zuletzt bearbeitet:
  • Freude
  • Danke
Reaktionen: RalfKahl und Nightly
RalfKahl schrieb:
var StandE : TextView = findViewById<TextView>(R.id.sStandE1) usw
dann kennt er diesen Wert nur innerhalb des when und ich muss diese 6 Statements überall mit rein nehmen. Und bei Anpassungen immer 6 Stellen anpassen.
Wenn du den Code nicht in die when schreibst sondern in den KlassenRumpf.

Was hast du dann, 6 Instanzvariablen die in der ganzen Klasse verfügbar sind.
Erstellt wird die Variable im Rump.
Eine Zuweisung in der onCreate()

Code:
lateinit var standE : TextView

    override fun onCreate(savedInstanceState: Bundle?) {
      ...
      standE = findViewById(R.id.sStandE1)

Lateinit vs Lazy in Kotlin: Understanding the Key Differences
Gängige Kotlin-Muster mit Android verwenden | Android Developers
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: RalfKahl
Das hört sich ganz prima an. Und du scheinst dich damit schon beschäftigt zu haben. Ich kenn das bisher noch nicht.

Ich habe das jetzt auch einmal versucht.
Nach dem ich die build.gradle erweitert habe, habe ich im onCreate folgendes eingefügt:
binding = ActivityT1060StandBinding.inflate(layoutInflater)
val view = binding.root


An der Stelle, an der ich dann die Felder verwenden möchte scheitere ich
binding.wErgebnis.text = viewModel.wErgebnis
Die Fehlermeldung ist: Unresolved reference: viewModel

Ist das viewModel hier wieder nur ein Platzhalter, den ich durch einen Wert von mir ersetzen muss?

Was sollte ich noch beachten, damit das funktioniert?
 
Zuletzt bearbeitet von einem Moderator:
Bearbeitet von: hagex - Grund: Direktzitat entfernt. Gruß von hagex
jogimuc schrieb:
Wenn du den Code nicht in die when schreibst sondern in den KlassenRumpf.

Was hast du dann, 6 Instanzvariablen die in der ganzen Klasse verfügbar sind.
Erstellt wird die Variable im Rump.
Eine Zuweisung in der onCreate()

Code:
lateinit var standE : TextView

    override fun onCreate(savedInstanceState: Bundle?) {
      ...
      standE = findViewById(R.id.sStandE1)

Lateinit vs Lazy in Kotlin: Understanding the Key Differences
Gängige Kotlin-Muster mit Android verwenden | Android Developers
lateinit! Danke. Daran hatte ich nicht gedacht. Und damit kann ich die Felder auch ohne Init anlegen und fehlerfrei verwenden.
 
swa00 schrieb:
setId() & getId()
View | Android Developers



Grundsätzlich :


Deine Vorgehensweise ist für eine Android UI dann bei der angedachten ElementenAnzahl eher "ungewöhnlich", resourcenaufwendig und werden mit an Sicherheit grenzender Wahrscheinlichkeit ein FrameSkipping verursachen.
Da sollten für die Performance die Anzahl der Codezeilen eher eine zweite Rolle spielen.

Daher :
Benutze einen RecyclerView mit Adapter - Dafür ist er gedacht.
Dynamische Listen mit RecyclerView erstellen | Views | Android Developers



Aber wenn Du es unbedingt krampfhaft zu Fuß umsetzen möchtest : (Jedem das Seine)

Erstelle dynamisch zur Laufzeit deine Views und füge sie mit addView dem Container hinzu.

Bsp in Java mit CustomView: (RalphsTileView mit Layout und Setter)
Code:
private RalphsTileView addTile (ViewGroup container, ........)
{
 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT, // Width
                LinearLayout.LayoutParams.MATCH_PARENT, // Height
                1.0f // Weight );

        RalphsTileView ka = new RalphsTileView (mContext);
        ka.setData(.......);
        ka.setLayoutParams(layoutParams);
        container.addView(ka);
        return ka;
}

Code:
// init
ArraList<RalphsTileView> list = new ArrayList();
for (int i = 0; i< 100; i++)
   list.add(addTile(container,........);
 
// ändern an pos 5
list.get(4).setData (.........);

// löschen an pos 5
list.remove(4);
container.removeViewAt(4);

// sortieren der list mit Collection

- Die List-Loop in einem separaten Core-Thread.
- Update des containers im UI-Thread.


Fazit :
Das Ganze ist mehr Aufwand und verwaltet keine dynamische Speicherverwaltung.
Dazu ist allerdings der RecyclerView eher in der Lage.

Wie man unschwer erkennt, habe ich hier noch nicht die richtige Erfahrungen im Erstellen von Kotlin Code. Ich komme aus der Ecke Großrechnerprogammierung. Da kennt man OO nicht. Und das ist das, mit dem ich hier zu kämpfen habe. Ich werde mir deinen Vorschlag einmal seht genau betrachten und schauen, ob und wie ich das bei mir integrieren kann.
 
RalfKahl schrieb:
Das hört sich ganz prima an. Und du scheinst dich damit schon beschäftigt zu haben. Ich kenn das bisher noch nicht.

Ich habe das jetzt auch einmal versucht.
Nach dem ich die build.gradle erweitert habe, habe ich im onCreate folgendes eingefügt:
binding = ActivityT1060StandBinding.inflate(layoutInflater)
val view = binding.root


An der Stelle, an der ich dann die Felder verwenden möchte scheitere ich
binding.wErgebnis.text = viewModel.wErgebnis
Die Fehlermeldung ist: Unresolved reference: viewModel

Ist das viewModel hier wieder nur ein Platzhalter, den ich durch einen Wert von mir ersetzen muss?

Was sollte ich noch beachten, damit das funktioniert?
Was willst du mit dem viewModel?
Schaue mal das Beispiel hier.
View Binding in Android Jetpack - GeeksforGeeks

Layouts and binding expressions | Android Developers
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: RalfKahl
Das mit dem RecyclerView ist eine sehr gute Idee. Dadurch sieht der Code doch wieder sehr schön aus.

Ich habe mir auch das mit dem binding ausprobiert. Und auch das gefällt mir sehr gut.

Viel Dank.
 
  • Danke
Reaktionen: swa00

Ähnliche Themen

5
Antworten
22
Aufrufe
1.632
590239
5
H
  • HoustonWeHaveAProblem
Antworten
3
Aufrufe
900
moin
M
R
Antworten
4
Aufrufe
1.015
R1Snake
R
Zurück
Oben Unten