Android Zugriff auf Eigenschaften einer Komponente

  • Antworten:20
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 11:50:51 via Website

Hallo zusammen,
ich versuche leider ohne Erfolg auf die Eigenschaften einer Spinner-Komponente unter Android Studio mit Kotlin zuzugreifen.

Es muss doch möglich sein, nach dem Zugriff über findViewByID und Zuweisung der Komponente an eine Variable, über diese auf die Eigenschaften der Komponente zuzugreifen!

Also nach folgender Art:
var spDropdown : Spinner

spDropdown = findViewByID(R.id.Spinnerkomponente auf der Form)
spDropdown.entries = Zuweisung einer Liste(Array, Menge, Aufzählung, ...)

Gruß Paul

Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.12.2020, 11:56:25 via Website

Wie in Java auch brauchst du dafür einen Adapter z.b. einen ArrayAdapter:
https://www.geeksforgeeks.org/spinner-in-kotlin/

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 12:03:29 via Website

Ich habe mir doch das Objekt geholt und ändere nun die Eigenschaft.
Ich kann doch auch eine Liste in der activity_main.xml über die Eigenschaft android.entries angeben.

Wofür also der Adapter?

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 12:57:40 via Website

Hallo weil der Spinner nun mal einem Adapter erwartet braucht in dem die Liste dein Array gehalten wird.

Mit entres wirst du da nicht weit kommen.

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 13:16:59 via Website

Wird der Adapter nicht lediglich benötigt, um die Daten aus der strings.xml an die Komponente zu koppeln, da ansonsten keine Verbindung bestünde?

Wenn ich ein Array dynamisch zur Laufzeit in der activity_main.xml erzeuge und befülle, sollte es doch möglich sein, die Werte sofort an die Eigenschaft der Komponente zu übergeben, ähnlich:

lateinit var strText: TextView
strText = findViewById(R.id.edtKomponentel)
strText.text="Hallo"
Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 13:28:00 via Website

Wo in deinem Code hast du was dynamisch erzeugt?
Das hast du nicht.

Ein Adapter wird gebraucht da kommst du nicht drum rum.
Schaue dir das Beispiel von Pascal an.
Da wird ein array aus einer xml resourse erstellt. Dann wird der Adapter erstellt dem wird beim Erstellen das Array übergeben. Und der Adapter wird anschließend dem spinner übergeben.

https://developer.android.com/guide/topics/ui/controls/spinner#kotlin

Ps Tipp ich denke du schaust dir mal java an. Auch wie dein Beispiel für das setzen einer textview in Java ausschaut.

Und du wirst sehen was, es für Vereinfachungen in Kotlin gibt. Aber eben bei weitem nicht so wie du es dir vorstellst.

— geändert am 04.12.2020, 13:37:24

Hilfreich?
Pascal P.
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 13:41:59 via Website

strText.setText("Hallo") ;
Geht in Java und auch kotlin

Das nur in Kotlin
strText.text="Hallo"

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 13:43:28 via Website

Ich habe auch nicht gesagt, dass ich in dem Beispiel etwas dynamisch erzeugt habe. Ich sagte "WENN ich etwas dynamisch erzeuge ..." DANN "sollte es doch möglich sein, die Werte sofort an die Eigenschaft der Komponente zu übergeben, ähnlich:

lateinit var strText: TextView
strText = findViewById(R.id.edtKomponentel)
strText.text="Hallo" "

Bitte richtig lesen. Wenn du nicht erklären kannst, warum das so ist, brauchst du nicht auf meine Frage zu antworten.

Ich würde gerne verstehen warum etwas unterschiedlich funktioniert oder läuft die Zuweisung der Liste zum Spinner im Hintergrund auch über einen Adapter? Kann man sich den Quellcode der im Hintergrund erzeugt/benutzt wird(z.B. Zugriff auf andere Klassen) auch ansehen?

Danke für deine Mühe

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 13:48:35 via Website

Ich sagte dir und auch Pascal sagte das du einen Adapter brauchst. Und in dem ist das Layout und auch dein dynamisch erstelltes array.

Lese die Doku.

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 13:57:49 via Website

Damit sind meine letzten Fragen nicht beantwortet!

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 14:14:57 via Website

In Kotlin werden die meisten (einfache) getter und setter Methoden von der android java api in Properties abgebildet.

Somit kannst du auch mit strText.text="Hallo"
Eine Eigenschaft in der Klasse Textview setzen. Auch wenn die echte Variable private ist.
Der kotlin Kompilier übersetzt es für dich in den fast gleichen Code wie java.

Auch bei dem spinner gibt es die die Zeile
spinner.adapter = adapter

Was genau das macht dem spinner den Adapter zu geben.

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 14:32:26 via Website

Jetzt kommen wir langsam in die richtige Richtung!

"In Kotlin werden die meisten (einfache) getter und setter Methoden von der android java api in Properties abgebildet."

Das Ergebnis einer Methode wird also als Eigenschaft der Komponente abgebildet, sodass man nicht mehr selber die Methoden aufruft, sondern lediglich die Werte angibt, die verwendet werden sollen.

Wie bereits gesehen wird hier also zum Beispiel die Eigenschaft Text mit einem String befüllt.

Demnach sollte doch die Eigenschaft Entries der Komponente Spinner zur Laufzeit auch mit einem String-Array befüllt werden können, ebenso wie dieses String-Array während der Entwurfzeit auch als Eigenschaft gesetzt werden kann.

Anscheinend ist diese Erleichterung noch nicht umgesetzt worden, sodass der umständlichere Weg(normaler Weg) über einen Adapter realisiert werden muss.

Danke für deine Mühe und Geduld.

Gruß
Paul

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 14:57:48 via Website

Der Adapter ist eine andere Klasse also ein anderes Objekt. Und das musst du bekanntlich auch erst erstellen Instanziieren.
Genauso das Array was wider ein anderes Objekt, Klasse ist. Was du mit dem Inhalt aus der Ressource füllst beim Erstellen des Arrays.
Das sind drei verschiedene Objekte die Instanz gibst du an die Eigenschaften der jeweiligen Klasse weiter.

— geändert am 04.12.2020, 17:50:12

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 15:04:46 via Website

Ich denke du übersiehst das es Objekte Instanzen sind da sie in Kotlin nicht mehr mit New erzeugt werden müssen.
Das überließ man manchmal schnell.

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 16:14:52 via Website

Das ist soweit klar, mich wundert es nur, dass im Entwurfsmodus lediglich ein String-Array angelegt werden muss, welches dann einer Eigenschaft zugeordnet wird, während im Laufzeitmodus(programmiertechnisch) mehrere Objekte für die Zuweisung instanziert werden müssen.

Im Normalfall ist das Setzen und Lesen von Eigenschaften, wie du bereits gesagt hast, über Methoden realisiert, sodass das Setzen und Lesen automatisch bei Zuweisung an die Eigenschaft erledigt wird. In diesem Fall ist es aber nur im Entwurfsmodus so einfach.

Nun gut, vielleicht wird es ja noch nachgearbeitet.

Danke für Hilfe.

Gruß Paul

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 16:36:37 via Website

Entwurfsmodus

Damit meinst Du den Designer in Android Studio Intelli J.
Der erstellst dir nur Layout xml Datein. Keinen Code.
Der Designer ist eine grafische Oberfläche der es dir einfacher macht dein Layout zu erstellen und dir nur eine Vorschau gib wie es zu Laufzeit aussehen kann wird. Mehr nicht.

Einen Entwurfsmodus gibt es nicht.

— geändert am 04.12.2020, 17:58:09

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 18:33:16 via Website

Ich rede von Android Studio. Hier kann ich im Design(Entwurfsmodus) die Eigenschaften setzen, welche dann in die activity_main.xml übertragen werden. Genauso andersherum. Eingaben in die activity_main.xml werden auf das Design(Entwurf/Vorschau) übertragen.

Das ist ein Entwurfsmodus.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

04.12.2020, 20:08:53 via Website

Das ist ein Entwurfsmodus.

Gut, wenn du das so nenn willst.
Für mich ist es eine Grafische Oberfläche mit der du das Layout entwerfen kannst. Und nicht alles selber in Xml schreiben musst.
Auch kannst du damit natürlich auch auf String Restoren in XML zugreifen und erstellen, sowie Menus, …. Das ist nur eine Hilfe die dir das arbeiten mit XML erleichtert und eine Vorschau anzeigen kann.

XML Dateien Layout sind nur Daten-Beschreibungen wie dein Layout aus sehen soll.
Die Android GUI erstellt dann zu Laufzeit aus der XML Datei dein Layout.
Was du auch in Java oder Kotlin Code schreiben könntest. Nur währe das sehr aufwendig. Deshalb der einfache weg über XML.

XML ist nur eine Daten-Beschreibung keine Programmierer Sprache. Die es dir einfacher macht,
dein Layout und auch Ressourcen zu gestalten. Zur Laufzeit wird deine Layout Datei eingelesen und aus allen View Elementen wird ein Objekt erstellt. Das alles macht der setcontenview Befehl.

Der Designer zeigt dir nur grafisch wie die in Xml Beschriebenen View-Elemente aussehen würden.
Er bietet eben auch die Möglichkeit gleich String oder auch String-Array Ressourcen gleich an Ort und Stelle zu erstellen. Dann kann er dir auch eine Vorschau liefern.

Der Designer ist ein in Android Studio integriertes Tool was dir ermöglicht dein Layout grafisch mit der Maus zu entwerfen, und nicht selber in einen einem Texteditor zuschreiben. Der eben auch eine Vorschau bietet.

PS. was der Design(Entwurfsmodus) macht oder ist musst du mir nicht erklären ich weiß das du wolltest es Wissen. Bist und warst der Meinung es reicht wenn es in deinem sogenannten Entwurfsmodus fertig ist, es auch in der App auch Fertig.

Ich rede von Android Studio.

das tuhen wir die ganze Zeit. Ich habe von nichts andern gesprochen.

— geändert am 04.12.2020, 20:40:43

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

04.12.2020, 22:40:11 via Website

In welche Einzelteile nun die Entwurfsansicht im Endeffekt aufgeteilt wird, steht doch hier gar nicht zur Debatte. Ob alles in einer Textdatei gespeichert wird oder XML-Datei ist völlig belanglos.

Fakt ist doch, das es sich bei Android Studio um eine IDE handelt, die Programmierern eine Sammlung der wichtigsten Werkzeuge zur Softwareentwicklung unter einer Oberfläche zur Verfügung stellt. Diese zeichnet sich, auch bei Android Studio, durch eine Entwurfsansicht, den Bereich wo alles zusammengeklickt wird und einen Programmbereich, wo die Abläufe festgelegt werden, die während des Programmablaufs (Laufzeit) erfolgen sollen, aus.

Wobei das nun Offtopic ist.

Allerdings würde mich interessieren, was für dich eine Entwurfsansicht definiert?

Gruß Paul

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

05.12.2020, 12:31:33 via Website

Hallo
Entwurfsansicht oder nicht die Begreiflichkeit steht hier auch nicht zu Debatte. Wie du das nennst ist deine Sache. Was ich unter dem Begriff Entwicklermodus verstehe ist auch unwichtig.
Eigentlich ist die ganze IDE eine Entwickler Plattform mit vielen Tools eines ist der Layout Editor mit der Text und Dasing-Ansicht .

durch eine Entwurfsansicht, den Bereich wo alles zusammengeklickt wird und einen Programmbereich, wo die Abläufe festgelegt werden,

in dem Layout Tool kannst du nur das XML File erstellen was dann im java Programm benutzt wird.
Das ist mittlerweile sehr Grafisch geworden und erweckt bei dir wohl den Eindruck das du damit dein Programm ähnlich einen App Baukasten zusammenbauen kannst.

Entscheidend ist das du der Meinung warst zumindest hatte es für mich den Eindruck.
Das wenn es in dem Layout Entwicklung Tool in der Design-Ansicht angezeigt wird auch schon in Java Code vorhanden sein muss. Dem ist nicht so wie du nun auch eingesehen hast.

Das Tool bietet dir auch gleich die Möglichkeit eine im Layout benutze Ressource zu erstellen. Und hat die Möglichkeit es auch als Vorschau anzuzeigen.

So wenn du nun in deinem Programm die Spinner Liste nicht aus einer StringArray-Ressource holst sondern wo anders her wird dein Entwiklermodus das nicht anzeigen.

Im Kotlin oder java code wird ein Array erstellt was die daten aus der xml Ressource bekommt .
Das muss aber nicht immer so sein du kannst die Daten zb. auch aus einer DB holen und in das Array laden, das dann dem Adapter übergeben.
Da zeigt die deine vermeintliche Entwurfsansicht nichts von der Liste.

Ich hoffe das nun deine Unklarheiten beseitigt sind.
Gruß Jörg

Hilfreich?
Kommentieren
Paul.Kunig
  • Forum-Beiträge: 13

05.12.2020, 12:51:58 via Website

Wir kommen nicht auf einen Nenner.
Belassen wir es dabei. Das eigentliche Problem ist ja gelöst.

Danke

Hilfreich?
Kommentieren