CheckBox Farbe in andere Activity übernehmen?

  • Antworten:24
Antonio P.
  • Forum-Beiträge: 113

08.10.2014, 17:39:09 via Website

Hallo,

hab ein kleines Problemchen mit meiner App. Es geht um folgendes.

Ich habe eine Activity in der ich 3 CheckBoxes habe. Jede CheckBox besitzt eine unterschiedliche Farbe (rot, grün, gelb).

Wenn ich nun EINE dieser CheckBoxes anklicke, dann möchte ich in der VORHERIGEN Activity die Farbe (der geklickten CheckBox) als Hintergrundfarbe für ein ein Item in der GridView übernehmen.

Hat jemand eine Idee?

Grüße
Antonio

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

08.10.2014, 17:55:27 via App

Hallo Antonio

Dann soll das also so ne art Einstellungsactivity werden oder?
Ich würde die Farben in den SharedPreferences speichern und sie in der anderen Activity auslesen und als Hintergrundfarbe übernehmen.

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

Antworten
Antonio P.
  • Forum-Beiträge: 113

08.10.2014, 18:32:15 via Website

Auslesen über Intent?

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

08.10.2014, 18:40:33 via Website

Über ein Intent wäre es acuh eine möglichkeit, (!) Aber dafür musst du immer erst die Farbwahlactivity öggenen dort einen Button drücken der dich dann per Intent weiterlatei.
Da sind Sharedpreferences um einiges einfach zu benutzen.

LG Pascal

PS: Zudem müsstest du über intents die Farbe bei jedem Appstart neu wählen.

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

Antworten
Antonio P.
  • Forum-Beiträge: 113

08.10.2014, 22:34:45 via Website

Okay, super. Ich werde es mir mal angucken. Danke für die Hilfe

Antworten
Gelöschter Account
  • Forum-Beiträge: 336

08.10.2014, 22:56:15 via App

Bitte :)

Android Developer

Antworten
Antonio P.
  • Forum-Beiträge: 113

13.10.2014, 18:34:45 via Website

Ich habe folgendermaßen die Farbe der Chechbox geholt (3. Zeile).
Ist es richtig wie ich die Farbe dem editor für die Shared Preference übergebe wenn ja wie hole ich diese Daten wieder in einer anderen Activity?

if(isChecked){
                    Toast.makeText(getActivity(), "Hier steht ein Text", Toast.LENGTH_SHORT).show();
                    int cb1Color = checkBox1.getCurrentTextColor();   ////Hier hole ich die Farbe der CheckBox
                    editor.putInt("cb1Color",cb1Color);               ////uebergeben der Farbe dem editor
                    editor.commit();
                    checkBox2.setEnabled(false);
                    checkBox3.setEnabled(false);
                }

— geändert am 13.10.2014, 18:35:05

Antworten
Sven R.
  • Forum-Beiträge: 1.904

13.10.2014, 20:21:36 via App

Ja, ist richtig.

Zum holen der Informationen:
Preferencemanager.getdefaultsharedprefernces().getint()

Google mal.

Edit: Ich würde nicht checkboxes benutzen sondern sowas wie radiobuttons. Weiß grade nicht, ob das so in Android heißt.

— geändert am 13.10.2014, 20:22:44

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

14.10.2014, 10:20:45 via Website

Wieso würdest eher RadioButtons nutzen?

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

14.10.2014, 16:53:20 via Website

Ich denke, er meint das so, weil man bei checkboxes mehrere auswählen kann und bei RadioButtons nicht.
Kommt es denn zu einem Fehler wenn du 2 Farben auswählst, denn das kannst du bisher.
Falls das nicht möglich sein soll, dann benutzt du am besten RadioButtons.

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

Antworten
Antonio P.
  • Forum-Beiträge: 113

14.10.2014, 17:16:39 via Website

Also ich habe das so gelöst mit den CheckBoxes, dass wenn ich eine CheckBox auswähle die anderen sich automatisch deaktivieren. Das heißt damit ist immer nur eine aktiv. Um die anderen wiederzu aktivieren, einfach die aktivierte CheckBox unchecken und schon sind wieder alle drei aktiv.

Im Debug Modus sehe ich aufjedenfall, dass ich ein Wert bekomme für meine Farbe der gecheckten Box.

Leider komm ich mit den SharedPreferences nicht klar. Es gibt zig verschiedene initialisierungen für die SharedPreferences. Bin ein wenig verwirrt.

Ich nutze diese CheckBoxes in einem Fragment und möchte mir dann die Farbe holen und dann in der vorherigen Activity, das Hintergrund des entsprechenden GridView Item färben.

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

14.10.2014, 18:12:39 via Website

Wie sieht denn bis jetzt dein Code aus?

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

Antworten
Sven R.
  • Forum-Beiträge: 1.904

14.10.2014, 19:52:58 via App

Wenn du nicht mehrere Preferences.xml haben möchtest, nimm immer getDefaultSharedPreferences(). Ich benutze selber nur das.
Mehrere xml würde ich nur bei einer sehr strukturierten und komplexen App benutzen. Bei großen Datenmengen empfehle ich eine Datenbank.

RadioButtons solltest du nehmen, weil sie Logik des "nur-eins-darf-aktiv-sein" von Haus aus implementieren. So müsstest du nicht da irgendwas von Hand in deinem Code machen.

Edit: Egal ob du auf die SharedPreferences vom Fragment oder von der Activity zugreifst, es sind immer die gleichen Preferences, weil sie, wie der Name schon sagt, mit allen Activities und Fragmenten "geteilt" werden.

— geändert am 14.10.2014, 20:00:01

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

15.10.2014, 15:42:53 via Website

also im Fragment direkt am Anfang steht die Initialisierung:

SharedPreferences pref = this.getActivity().getSharedPreferences("ColorPrefs",0)
    SharedPreferences.Editor editor = pref.edit()

In den OnCreateView() habe ich folgendes aber 3 mal...also für jede CheckBox. Für Übersichtlichkeit stelle ich nur die Beschreibung einer CheckBox.

checkBox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

                if(isChecked){
                    Toast.makeText(getActivity(), "Super, Du hast die Aufgabe richtig gelöst", Toast.LENGTH_SHORT).show()
                    int cb1Color = checkBox1.getCurrentTextColor()
                    editor.putInt("green",cb1Color)
                    editor.commit()
                    checkBox2.setEnabled(false)
                    checkBox3.setEnabled(false)
                }
                else {
                    checkBox2.setEnabled(true)
                    checkBox3.setEnabled(true)
                }
            }
        })

In der vorherigen Avtivity, weiß ich nicht genau wo ich alles implementieren soll ob in der onCreate oder in der onResume.

Antworten
Sven R.
  • Forum-Beiträge: 1.904

15.10.2014, 15:54:34 via App

In der Activity davor ist onResume angebracht, weil zu dieser Activity wieder zurückgekehrt werden wird. Die onResume wird immer beim wieder-Öffnen aufgerufen.

Wo genau im Fragment initialisierst du denn den Editor? Wie ich das lesen kann, machst du das nicht in der onCreateView; da sollte es aber passieren. Am besten machst du den Editor auch noch final, damit du nur eine Instanz für alle Callbacks brauchst.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Sven R.
  • Forum-Beiträge: 1.904

15.10.2014, 15:54:39 via App

In der Activity davor ist onResume angebracht, weil zu dieser Activity wieder zurückgekehrt werden wird. Die onResume wird immer beim wieder-Öffnen aufgerufen.

Wo genau im Fragment initialisierst du denn den Editor? Wie ich das lesen kann, machst du das nicht in der onCreateView; da sollte es aber passieren. Am besten machst du den Editor auch noch final, damit du nur eine Instanz für alle Callbacks brauchst.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

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

15.10.2014, 15:55:09 via Website

Hallo Antonio,
Dein code sieht garnicht so schlecht aus.
Was ich nicht verstehe ist das: int cb1Color = checkBox1.getCurrentTextColor()
Für was steht nun das integer?
Farbnummer etc?
Verstehe ich noch nicht.

In deiner Activity machst du das am Anfang am Besten in der onCreate bzw. on Start.
Falls du es auch noch in der onResume brauchst kannst du ja eine Methode daraus machen und sie von beiden stellen aus aufrufen.

LG Pascal

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

Antworten
Antonio P.
  • Forum-Beiträge: 113

15.10.2014, 16:23:52 via Website

Vielen Dank für die schnellen Antworten.

@Pascal: ganz einfach ich brauche ja die Farbe der gecheckten Box und übergebe diese einem int Wert. Das heißt das ist die Farbnummer.

Nächstes Problem wäre wie ich die Farbe für das GridView Element setze. Kennt ihr da eine Methode?

Ich hattte folgendes mir überlegt.

gridview.getChildat(position).setBackgroundColor(cb1Color)

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

15.10.2014, 16:29:41 via Website

Das sollte funktionieren, jetzt musst du nur noch die Integer Zahl aus den Preferences auslesen und dann die Farbe setzen.

LG Pascal

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

Antworten
Antonio P.
  • Forum-Beiträge: 113

16.10.2014, 16:57:31 via Website

Das habe ich nun als Code in der vorherigen Activity in der onCreate Methode

SharedPreferences pref = getSharedPreferences("ColorPref",0)
    int colorGreen = pref.getInt("green",cb1Color)
    int colorYellow = pref.getInt("yellow",cb2Color)
    int colorRed = pref.getInt("red",cb3Color)

und dann setze ich folgendermasen die Farbe

gridView.getChildAt(position).setBackgroundColor(colorGreen)
        gridView.getChildAt(position).setBackgroundColor(colorYellow)
        gridView.getChildAt(position).setBackgroundColor(colorRed)

das ist alles in der methode onCreate.

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

16.10.2014, 22:04:53 via App

Und funktitoniert das so?

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

Antworten
Antonio P.
  • Forum-Beiträge: 113

17.10.2014, 08:27:41 via Website

Leider nein. Es hat einmal funktioniert mit diesem Code

        checkBox1.setChecked(pref.getBoolean("cb1_isChecked",false))
        checkBox2.setChecked(pref.getBoolean("cb2_isChecked",false))
        checkBox3.setChecked(pref.getBoolean("cb3_isChecked",false))

die states werden auch gespeichert, aber wenn ich sie wieder unchecke und dann wieder in die Activity zurückkehre sind sie wieder gesetzt.

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

17.10.2014, 12:37:11 via Website

nehme an, dass die Warscheinlich musst du das noch überarbeiten, ich nehme an, dass die Activity im hintergurnd noch gespeicher ist und dewegen die neuen Einstellungen nicht übernommen werden.
Du müsstest entwder mit einem Flag zur änderung Arbeiten oder einfach in der OnResume die Farben noch mal setzten.

LG Pascal

— geändert am 17.10.2014, 12:38:26

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

Antworten
Sven R.
  • Forum-Beiträge: 1.904

17.10.2014, 17:45:03 via App

Ich meinte ja schon, dass das Lesen der Farben in der onResume sehr sinnvoll ist.
Ich würde an deiner Stelle nur die Farbe der CheckBox speichern und nicht, welche der Boxen aktiviert ist. So ist das ganze flexibler.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten