Spinner - Textcolor im Code ändern (nicht XML!)

  • Antworten:10
  • Bentwortet
next user
  • Forum-Beiträge: 53

15.01.2018, 16:19:13 via Website

Hi Leute,

ich habe im Netzt rumgeschaut, finde jedoch ständig die gleiche Lösung mit einer Spinner-XML, wo dort dann in der Textview die Farbe festgelegt wird.
Soweit auch ok, jedoch möchte ich die Textfarbe des Spinners im Code selber ändern. Also dachte ich mir ich gebe der Textview in der custom_spinner.xml einfach eine ID und ändere damit dann die Farbe.
Jedoch bekomme ich immer die Fehlermeldung, das "setTextColor" auf ein Null-Objekt angewendet wird.

Da die Textview ja als Layout in den Spinner gesetzt wird, muss/kann ich die Textview vielleicht irgendwie über den Spinner ansprechen?

Meine Textview sieht so aus:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinnerTitle"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" />

Die Textview wollte ich ganz normal über:

spinnerText = MainActivity.findViewById(R.id.spinnerTitle);

ansprechen, aber klappt nicht.

Im Netz waren auch Beispiele mit dem Adapter (getChildAt(0)) in der Funktion "setOnItemSelectedListener()", jedoch habe ich irgendwie ein komisches Gefühl bei.
Das kann doch nicht das wahre sein, oder?

Bin auch nicht gerade der Erfahrene Entwickler (Android / Java).
Könnte mir da jemand helfen. Möchte am liebsten einfach nur die Textview ansprechen...

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

15.01.2018, 17:43:57 via App

Je nachdem wann sich die Farbe ändern soll.
Falls bei select ist das mit dem Listener und dann Farbe setzen schon richtig.

Falls die Farbe auf alle Items dann nimm lieber eine ArrayAdapter mit CustomTextView:
https://stackoverflow.com/a/43817382

— geändert am 15.01.2018, 17:44:15

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

Antworten
next user
  • Forum-Beiträge: 53

15.01.2018, 18:43:12 via Website

Hi Pascal,

danke für die Antwort.
Vielleicht habe ich auch einfach nur einen Denkfehler, aber ich dachte es so:

Es gibt die Anzeige und die eigentliche Liste. Ich wollte jetzt einfach die Farbe der Anzeige verändern, unabhängig einer Selektion. Das mit dem Listener wirkt auf mich so, als würde ich jedesmal nur die Selektion farblich anpassen, nicht die Anzeige (Textview) selber.

Falls die Farbe auf alle Items dann nimm lieber eine ArrayAdapter mit CustomTextView:
https://stackoverflow.com/a/43817382

Ich nutze ja einen ArrayAdapter, dem ich die spinner.xml mit meiner Textview als Layout übergebe.

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

15.01.2018, 19:04:26 via App

Jap mit den Listener hast du recht, da würde nur die aktuelle Selektion farbig werden
Wenn du alle Item färben willst, machst du das in der getView des Array Adapters

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

Antworten
next user
  • Forum-Beiträge: 53

17.01.2018, 14:55:41 via Website

Pascal P.

Jap mit den Listener hast du recht, da würde nur die aktuelle Selektion farbig werden
Wenn du alle Item färben willst, machst du das in der getView des Array Adapters

Hab heute wieder ein bischen Zeit aufbringen können und weiter gemacht.
War etwas knifflig, aber ich habe es dann auch verstanden und hinbekommen.

Danke Pascal.


PS: Die Frage gehört eigentlich nicht hier rein, aber vielleicht hat jemand eine kurze Antwort darauf und ich muss keine neue erstellen.
Es geht um einen Switch (Switch-Contrlol Element im Layout). Ich habe einen Switch im Main-Layout, der bei Statusänderung immer eine Funktion aufruft. Das Problem:

Wenn der Switch im aktiven Zustand ist und ich das Handy nur drehe, so wird die Funktion wieder aufgerufen.
Ich habe eine einfache Log-Ausgabe bei der Funktion "setOnCheckedChangeListener" der Switch gesetzt. Wenn Switch aus ist und ich Handy drehe, passiert nichts weiter.
Wenn Switch an ist und ich Handy drehe, kommt er in "setOnCheckedChangeListener" rein, wie kann das sein?

Antworten
next user
  • Forum-Beiträge: 53

17.01.2018, 19:54:48 via Website

Pascal P.

Bein Drehen wird die Activity im normalfall neu initiiert, wenn in Manifest nix anderes angegeben.

Ja, das ist mir auch bewusst, allerdings wieso wird "setOnCheckedChangeListener" aufgerufen, und das nur wenn der Switch vorher aktiv war.
Kann es sein, das die Activity beim Initialisieren den Status der Switch auf inaktiv setzt, es dann aber direkt auf den vorherigen Zustand (aktiv) setzt und somit "setOnCheckedChangeListener" aufgerufen wird?

Scheint mir etwas komisch. Das kann es doch nicht sein, oder?
Hast du eine erklärung dafür?

Antworten
swa00
  • Forum-Beiträge: 3.704

17.01.2018, 21:04:16 via Website

Hallo next ,

Das Problem ist mir auch bekannt .

Du musst in dem Falle händisch mit boolean flags arbeiten und selbst abfangen.
Einmal setzen, Flag merken und den Flag im Listener auswerten.

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
next user
  • Forum-Beiträge: 53

18.01.2018, 10:28:47 via Website

swa00

Hallo next ,

Hi ;)

swa00

Das Problem ist mir auch bekannt .

Gut. dachte schon es liegt an mir. Anscheinend ist es aber wirklich die Reinitialisierung der Activity.

swa00

Hallo next ,

Du musst in dem Falle händisch mit boolean flags arbeiten und selbst abfangen.
Einmal setzen, Flag merken und den Flag im Listener auswerten.

Hab schon ein paar Boolean-flags (hab wegen C++ immer bool im Kopf), dieses wird aber das erste vom Typ "nicht gewollt, aber notwendig" :D

Naja, vielen dank nochmal euch beiden.

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

18.01.2018, 10:50:30 via Website

Ich hab das configChange immer mit android:configChanges="keyboardHidden|orientation|screenSize"
in der Maifest unterbunden.
Ich weiß, ist zwar nicht das beste, aber dann muss ich mich um so einen kram nicht kümmern...

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

Antworten
next user
  • Forum-Beiträge: 53

18.01.2018, 14:27:03 via Website

Ja, nur wenn ich das z.B. bei Orientation unterbinde, müsste ich ein paar Sachen im Code ändern und "manuell" managen...

Antworten