ScharedPreferences wie gehe ich damit um??

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

20.12.2014, 14:44:38 via Website

Hallo,

ich möchte folgende einfache Funktion in meine App implementieren.

Ich habe drei Activities (Activity A ,Activity B und Acitvity C)

In Activity A habe ich eine ListView mit 10 Item die bringen mich in Activty B und ladet eine GridView mit verschieden viele Items. Wenn ich auf ein Item der GridView klicke komme ich in Activty C. In dieser Activity möchte ich über die ActionBar über drei Items(1.grün, 2.rot 3.gelb) in der Methode onOptionsItemSelcted einen der drei Zustände speichern.

Nun zu mein Problem:
Wenn ich nun das Item "grün" anklicke möchte ich, den Zustand speichern UND in der Activity B den entsprechenden Item der GridView in der Farbe "grün" einfärben.

Das gleiche auch mit rot und gelb.

Habt ihr mir ein Lösungsansatz??

Vielen Dank schon mal

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

20.12.2014, 14:52:36 via Website

Über SharedPreferences ist sowas schwierig zu lösen, da du ja jeden Einrag eindeutig identifizieren musst um die Farbe festzustellen, ein Ansatz wäre ein Array zu machen und darin alle Farben zu speichern, aber das ist Semioptimal.
Als alternative kannst du alles in eine DB schreiben und über SQL Statements deine Daten holen.
So könntest du alles Dynamisch lösen und ggf. sogar über die DB neue einträge zu deinen 10 hinzufügen.

LG

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

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

20.12.2014, 15:03:03 via Website

Eine Datenbank will ich ungern machen. Ich wollte gerne die SharedPreferences nutzen bzw. den Ansatz mit dem Array. Im Prinzip sind alle EInträge eindeutig definiert

— geändert am 20.12.2014, 15:06:09

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

20.12.2014, 15:07:27 via Website

Dann kann ich dir nur ein Array empfehlen indem du die ganzen farben speicherst, den ich nehme an, das ganze würde komplizierter werden wenn du für jeden eintrag eine Preference Variable nimmst oder?
Ich weissn icht wie viele Farben du im endeffekt speichern willst aber wenn jede arbe eine ID oder sowas (von dir vordefiniert) hat dan sollte es auch ohne Array machbar sein.

Lg

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

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

20.12.2014, 15:09:45 via Website

Ich versteh das nicht ganz. Es sind ja nur drei Farben (rot, grün, gelb). Und je nachdem welche angeklickt wird, soll das Item der GridView in dieser Farbe als Hintergrund gesetzt werden.

EDIT:
Ich meinte dass die Items in der GridView vollständig definiert sind.

— geändert am 20.12.2014, 15:11:56

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

20.12.2014, 15:31:39 via Website

Ich könnte ja die Farbe mit eintem Intent übergeben und in der Activity setzen. Aber das Problem ist das speichern der Daten.

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

20.12.2014, 16:05:14 via Website

Ja genau, du musst aber wissen welches Item nachher welche Farbe haben muss:
Vorschlag:

[GridView1][Item1]:Rot
[GridView1][Item2]:Grün . . .
[GridView3][Item12]: Gelb

Da ich aber nicht weiss wie deine Struktur aussieht kann ich dir halt nur algemeine Lösungsvorschlöge geben.

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

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

20.12.2014, 16:13:43 via Website

okay.

Im Prinzip kann jedes Item von jeder GridView immer nur eine Farbe annehmen. Je nachdem welches in der Activity C angeklickt wurde.

Antworten
pepperonas
  • Forum-Beiträge: 434

20.12.2014, 16:16:02 via Website

Hallo,
"speichern" musst du dafür nichts... Du legst global und statisch deine Zustände an (zB so wie es Pascal bereits beschrieben hat - bspw: "Schlüssel-Wert-Paare"). Via Intent gibst du einen Integer weiter (also zB für grün die 0), nimmst den entgegen und färbst abhängig davon die ActionBar, (kann sein, dass es noch vor setContentView erfolgen muss, oder du anderweitig das Layout refreshen musst).
Und für die dritte Activity das gleiche nochmal...

Open Source

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

20.12.2014, 16:19:57 via Website

meine schuld ich habe es nicht präzise genug erklärt. Ich möchte die Zustände abspeichern wenn ich die app schließe. Aber danke für die Ansätze

— geändert am 20.12.2014, 16:20:11

pepperonas

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

20.12.2014, 17:54:56 via Website

Könntest du das mir genauer erklären mit dem "Schlüssel-Wert-Paare"

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

20.12.2014, 18:25:37 via Website

Vielen Dank Pascal.

Das heißt ich mache eine Haschmap mit drei Werten zum Beispiel (0, grün) (1, rot) und (2, gelb) schicke dann ein intent für grün, rot und gelb und setze in der vorherigen Activity die Farbe als Hintergrund.

Würde es denn nicht gehen mit true und false einfach?

Zum beispiel ich klicke rot an also ist:
rot = true (logisch 1)
grün = false (logisch 0)
gelb = false (logisch 0)

schicke einen Intent mit drei putExtra zur vorherigen Activity und mache eine if abfrage, welches der drei farben logísch 1 oder logisch 0 ist und dementsprechend setze ich das hintergrund?

Ich hoffe ihr könnt mir helfen, das ist das letzte für meine Studienarbeit, dann kann ich endlich alles abgeben.

— geändert am 20.12.2014, 18:25:50

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

20.12.2014, 18:40:08 via Website

Wieso machst du das so umständlich?
Wenn du es einfach machst dann brauchst du eine HashMap bei der der Key eindeutig identifizierbar is und als Value nimmst du eine Integer und zwar am besten die Konstante Color.RED
Jetzt musst du nur einen Weg finden die Map richtig zu speichern und einzulesen.

LG

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

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

20.12.2014, 22:04:14 via Website

Hab es nun so versucht wie ich es am besten verstanden habe.

Nun stimmt etwas mit meiner onResume Methode nicht. Könnt ihr einen Blick darauf werfen.

    @Override
protected void onResume() {
    super.onResume()
    GridView gridView = (GridView)findViewById(R.id.gridView)
    int pos = gridView.getCheckedItemPosition()

    if(getColorGreen()==true){
        gridView.getChildAt(pos).setBackgroundColor(Color.parseColor("#81F781"))
    }
    else if (getColorRed()==true)
    {
        gridView.getChildAt(pos).setBackgroundColor(Color.parseColor("#FF4000"))
    }
    else if (getColorYellow()==true){
        gridView.getChildAt(pos).setBackgroundColor(Color.parseColor("#FACC2E"))
    }
}

so sehen meine get Methoden aus

    public boolean getColorGreen() {
    Bundle bundle = getIntent().getExtras()
    colorGreen = bundle.getBoolean("colorGreen")
    return true
}

— geändert am 20.12.2014, 22:06:21

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

20.12.2014, 22:16:12 via Website

 public boolean getColorGreen() {
    Bundle bundle = getIntent().getExtras()
    colorGreen = bundle.getBoolean("colorGreen")
    return true;
}
  1. Überall fehlen die Semikolons ( ; )
  2. wo ist ColorGreen definiert, sollte auch hier in der mthode sein.
  3. du machst immer return true dabei sollte die boolean colorGreen returned werden.

Soweit so gut.
Ich verstehe immer noch nich wieso du dir so viele Steine in den Weg legst.

Würdest du es über die Color Konstanten machen dann würde eine Zeile inder der onResume reichen:

gridView.getChildAt(pos).setBackgroundColor(getColor(pos));

In in der getColor mit der Postition als Parameter könntest du dann entweder deine Farbe aus einem Speicher lesen oder aus deinem Intent oder sonstwo beziehen.
Nur ist eigentlich die Position wichtig, denn so wie es jetzt ist wird immer nur die Farbe eines Feldes gesetzt, vielleicht willst du alle mal färben?
Wenn ja dann musst du dir da auf jeden Fall etwas besseres überlegen, denn dann benötigst du eine Schleife über alle GridView Felder.

LG

— geändert am 20.12.2014, 22:16:27

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

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

20.12.2014, 22:40:26 via Website

Vielen Dank Pascal.

Nun kommt kein Fehler aber die Farben werden nicht gesetzt :S

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

20.12.2014, 22:44:34 via Website

Ok, was ist denn in der Integer pos enthalten?
Am besten du gibtst das mal per Log aus.

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

Antworten
pepperonas
  • Forum-Beiträge: 434

21.12.2014, 00:07:23 via Website

Wieso über 3 verschiedene Getter? Warum returnt getColorGreen immer true? So lässt sich nur ablesen, dass die Funktion aufgerufen wurde... Meiner Meinung nach hier redundant. (Ich hoffe ich liege diesmal richtig :D )

Lege den Farbwert als int (Color-Value) im Intent ab, hole den Wert wieder heraus und setze OHNE Color.parseColor(xyz) die Hintergrundfarbe.
Sprich setBackgroundColor(HIER DER WERT DER VARIABLEN AUS GET-INTENT) aka "Color-Value" wie zB 0xFF0000

— geändert am 21.12.2014, 00:08:43

Open Source

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

23.12.2014, 10:06:39 via Website

Pascal P.

Ok, was ist denn in der Integer pos enthalten?
Am besten du gibtst das mal per Log aus.

Hallo Pascal ich bekomme für die pos eine -1. Wie kann ich denn die position des angeklickten items an die Methode onResume übergeben? Bundle onSaveInstaceState, oder Übergabe Parameter oder gibt es eine Möglichkeit

Antworten
pepperonas
  • Forum-Beiträge: 434

23.12.2014, 17:48:37 via Website

Hallo,
-1 ist meist ein Indikator für einen Fehler. Bist du sicher, dass du alle Listeners gesetzt hast?
In onResume direkt kannst du nichts direkt übergeben. Im Normalfall holt man via Intent und Bundle die Werte aus der alten Activity.

Kannst ja nochmal deinen aktuellen Code posten..

Open Source

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

23.12.2014, 17:55:23 via Website

ist in/während der onResume überhaupt ein item ausgewählt?
Denn ich kann mir gut Vorstellen dass der Focus des geclickten Felldes durch die andere Activity gelöscht wird und somit ist kein Focus mehr verfügbar ist. Daduch kann auch die pos -1 zustandekommen.

LG

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

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

28.12.2014, 17:17:15 via Website

Hallo und danke für die Antworten. Hier ist nun mein Code. Jedoch bekomme ich nun nicht mehr -1 für die position in diesem fall index sondern was völlig anderes.

    @Override
protected void onPause() {

    super.onPause()
    index = gridView.getFirstVisiblePosition()
}


@Override
protected void onRestart()
{
    super.onRestart();
    gridView.setSelection(index);

    Log.d("++++++++++Das ist die Position++++++++++", "pos: " + Integer.toString(index))

}

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

28.12.2014, 22:37:33 via App

Antonio Pomarico

[...] sondern was völlig anderes.

Was denn, wenn ich fragen darf?

Die Methode, von der du Wert für deine Variable "index" holst, gibt anscheinend die "erste sichtbare Position" zurück. Und die willst aber die aktuell selektierte Position bekommen, oder?

Edit: Ich finde gar nicht die Methode firstvisible... in der Dokumentation.

— geändert am 28.12.2014, 22:40:20

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
Georg C.
  • Forum-Beiträge: 235

29.12.2014, 01:52:43 via Website

Hallo,
Grund, weshalb ich mich in dem Forum etwas zurückhalte ... ist / sind:
- ich kenne mich im Android immer noch nicht gut aus ...
...
- und verstehe vieles ... nicht!

Warum ich mich hier wieder einmische ist / sind:

@Sven R.

Edit: Ich finde gar nicht die Methode firstvisible... in der Dokumentation.

Die Methode ist hier zu finden. NUN!
Sollte mein link dich zu der Methode (ist gewollt - selber direkt) führen, scrolle bitte (danach) nach oben.
Die Vererbungshierarchie ist (soll) nicht zu übersehen sein.
AdapterView <--- package android.widget ...
Was das Bedeutet muss ich hier (einem Programmierer ist es klar) nicht erläutern!

@Antonio Pomarico
- poste hier Klartext
- verschweige gar nichts
...
- poste das richtige (anstatt der Pseudo- oder manipulierten) -> Code
nur ein Tipp!

Im Fall, das Dein Code NICHT! angepasst - manipuliert ist / wird; - poste bitte hier (quasi als Beweis) Dein Projekt.
...

LG
Georg

Ps.
Ein gutes neuen Jahr für ALLE! vom Konservativen OPA!
& wieder - bin raus!

— geändert am 29.12.2014, 02:05:35

Sorry für Gramatik & Stilistik Fehler.

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

29.12.2014, 09:51:03 via App

Achso okay. Es wird aber nie der selektierte index geholt...

— geändert am 29.12.2014, 09:52:31

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
pepperonas
  • Forum-Beiträge: 434

29.12.2014, 10:54:57 via App

Jo, auf einen Adapter zurückzugreifen könnte hier uU der entscheidende Tipp sein, da hat Georg schon recht.
Wie viel man von seinem Code preisgeben möchte bleibt ja, jedem selbst überlassen, so gesehen finde ich nicht dass jemand etwas "quasi als Beweis" nachliefern muss. :-P aber gleichzeitig ist es für alle Beteiligten einfacher wenn der originale Code möglichst vollständig vorliegt, dementsprechend gut bzw schlecht kann dann auch geholfen werden...

btw: Ich gehe stark davon, dass hier im Forum kein Code "geklaut" wird - vor allem nicht in Threads wo der Code offensichtlich sowieso nicht das tut, was er soll :-)

Open Source

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.957

29.12.2014, 12:09:13 via App

Hallo,

was will man heut zu Tage noch an Code klauen?

Die meisten Libs sind OpenSource!
Und die es nicht sind, werden durch ihre Dokumentation erklärt, also daher gibt es nichts was es nicht schon gegeben hat.

Ich selbst bin Freund der OpenSource und erstelle meine Projekte auch so.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antonio P.

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

29.12.2014, 15:54:39 via Website

@others
Ich habe nun folgendes:

in der onPause bekomme ich die richtige position bzw. index angezeigt. (zum Beispiel index = 1)

in der onRestart bekomme ich nun position bzw. index eine 0

ich weiß nicht woran das liegen kann.

hier mein code mit adapter und onCreate

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.detailactivity);

    TextView tvTitleLabel = (TextView)findViewById(R.id.tvTitleLabel);
    gridView = (GridView) findViewById(R.id.gridView);

    Bundle extras = getIntent().getExtras();
    resAufgabenDrawableIds = getIntent().getIntegerArrayListExtra("resAufgabenDrawableIds");
    resHinweiseDrawableIds = getIntent().getIntegerArrayListExtra("resHinweiseDrawableIds");
    resLoesungenDrawableIds = getIntent().getIntegerArrayListExtra("resLoesungenDrawableIds");


    if (extras != null) {

        title = extras.getString("thema");
        tvTitleLabel.setText(title);

        array = extras.getStringArrayList("aufgabenFiltered");
        gridView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, array));
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {

                index = position;

                clickedAufgabe = resAufgabenDrawableIds.get(position);
                clickedHinweise = resHinweiseDrawableIds.get(position);
                clickedLoesungen = resLoesungenDrawableIds.get(position);

                Intent intent = new Intent(getApplicationContext(), ShowDetailActivity.class);
                intent.putExtra("clickedAufgabe", clickedAufgabe);
                intent.putExtra("clickedHinweise", clickedHinweise);
                intent.putExtra("clickedLoesungen", clickedLoesungen);
                startActivity(intent);

            }
        });

    }

}

@Override
protected void onPause() {

    super.onPause();
    index = gridView.getFirstVisiblePosition();
}

//Hier wird die falsche position benutzt
@Override
protected void onRestart()
{
    super.onRestart();
    gridView.setSelection(index);

    Log.d("++++++++++Das ist die Position++++++++++", "pos: " + Integer.toString(index));


}

— geändert am 29.12.2014, 15:56:52

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

29.12.2014, 22:23:06 via App

Wie gesagt, die Methode in der onPause() gibt was anderes als die aktuelle Position zurück. Die aktuelle Position ist schon in der Variable, wenn mindestens einmal ein Item angeklickt wurde.
Vielleicht willst du aber auch gar nicht die Position haben. Dann habe ich aber keine Ahnung, warum du die firstVisiblePosition selektieren möchtest. Und diese Position holst du dir auch noch in der onPause(). Dabei könntest du dir diese Position auch in der onRestart() holen...

Frage: Was willst du in der onRestart selektieren?

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

30.12.2014, 10:13:44 via App

In der onRestart möchte ich die Position des zuletzt angeklickten items in der grid view selektieren.

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

30.12.2014, 10:15:26 via App

Ich denke das du in der onRestart nichts selektieren kannst da duch das Stoppen der App der Focus verloren geht. Da musst du dir etwas anderes Überlegen. Z.b. kannst du bei onPause die aktuelle Pos in den SharedPrefs speichern. Dann kannst du die Position laden aber was bringt die die Aktuelle Position du musst deine Farben doch über alle Items anwenden.

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

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

30.12.2014, 12:29:46 via App

Antonio Pomarico

In der onRestart möchte ich die Position des zuletzt angeklickten items in der grid view selektieren.

Die Position bekommst du im Listener. Die speicherst du ja auch in der Variable index.
Dann nimm mal die Sachen aus der onPause () raus, und wenn die Variable index überlebt(sollte sie), kannst du das in der inRestart selektieren. Probier einfach mal

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

10.01.2015, 13:22:09 via Website

Pascal P.

Ich denke das du in der onRestart nichts selektieren kannst da duch das Stoppen der App der Focus verloren geht. Da musst du dir etwas anderes Überlegen. Z.b. kannst du bei onPause die aktuelle Pos in den SharedPrefs speichern. Dann kannst du die Position laden aber was bringt die die Aktuelle Position du musst deine Farben doch über alle Items anwenden.

Genau Pascal. Ich muss über alle Items die Farbe setzen können. Die Probleme liegen gerade darin:

  1. Ich weiß nicht wie ich die Logik über alle Elemente durchlaufen lassen kann.
  2. Ich habe noch nie eine HashMap implementiert und weiß nicht wie diese funktionieren.
  3. Ich muss aufjedenfall alles speichern können sollte man die App verlassen.

Ich hoffe jemand kann mir eine Erklärung geben, wieso es nicht mit den SharedPreferences geht und was der Unterschied zwischen eine HashMap und SharedPreferences ist?

Ich habe nun folgende Idee:
Da jedes einzelne Item eindeutig über die "position" definiert ist, zum Beispiel:

ListViewItem: position = 3
GridViewItem: position = 11

In Worten: Thema Nummer 3 und Aufgabe Nummer 11

Nun könnte ich im Prinzip diese beiden Werte zum Beispiel in einem int Array speichern, zum Beispiel:

positionArr = [3 11]

nun weiß "positionArr" um welches Element es sich handelt.

Wie kann ich aber jetzt definieren, das Item in der GridView grün färben?

Ich nehme auch andere, einfachere, verständlichere Lösungsanätze an

Beste Grüße
Antonio

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

10.01.2015, 15:11:18 via Website

So jetzt gehen wir das ganze erstmal langsam an.
Speicherngeht in Android mit den SharedPreferences oder anderen Speichermöglichkeiten. Eine HashMap ist nur eine Liste änlich einer ArrayList (welche du übrigens auch benutzen könntest).

Ich fasse einmal dein Vorhaben kurz zusammen:

ListView mit items - beiClick -> 2. Activity mit einer GridView - click auf GridItem -> Activity 3 mit Infos + Farbauswahl

So wenn man das ganze jetzt logisch angeht, muss die Info der Farben immer weiter nach oben durchgereicht werden, sodass du in Activity 1 oder auch in Activity 2 weisst welche Farben die einzelnen items haben.

Über mehrere (geschachtelte) Arrays kann man das machen.
Activitiy 3 muss wissen welches Item in der GridView gedrückt wurde um die Farbe einer Position zuordnen zu können.
Nachdem die Farbe ausgewählt ist muss diese gemeinsam mit der GridItem pos in eine ArrayList geschreiben werden, damit du die Zuordnung Item<>Farbe hast.
Da du das für alle GridView items machen kannst ist das dann schonmal erledigt.
Da das aber für verschiedene GridViews funktionieren soll brauchst du noch eine Zuordnungslogik welche die Arrays dann drichig den GirdViews zuordnet.
Aber kümmere ich erstmal üm das dann können wir weitersehen.

LG Pascal

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

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

10.01.2015, 18:46:50 via Website

Danke Pascal.

Im Prinzip so...

ArrayList<Integer> kombi = new ArrayList<Integer>;
kombi.add(position_2);
kombi.add(color);

wobei "position_2" das angegklickte Item in der GridView ist und
"color" die ausgewählte Farbe ist.

Aber jetzt stellt sich die Frage wieder. Wenn ich nun zurück gehe in die zwei Activity dann löscht sich das ja wieder. Oder?

Danke

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

10.01.2015, 18:52:48 via Website

Schon nur da kommt jetzt wieder die HashMap ins spiel statt der ArrayList da du bei der HashMap KeyValue Pairs machen kannst.
Dann kannst du als Key die Pos übergeben und als Value die Farbe.

Das mit dem Speichern ist so eine sache.

Eigentlich musst du die Werte immer mit in die Activity übergeben oder direkt dortdrin speichern (als Methodenparameter)
Dann Brauchst du noch eine Liste der Listen da du ja für jedes ListItem wieder eine eigene Farben Liste hat.

Und dann am Ende musst du das auch speichern aber irgendwie könnte das kompliziert sein, da du ja die listen irgendwie sinvoll speichern musst. Theoretisch kannst die Listen serialiseiren uns als XML exportieren und importieren.

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

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

14.01.2015, 08:50:31 via Website

Das hört sich wirklich sehr komplex an. Ich habe inzwischen eine andere Idee. Wie sieht es denn mit einem Bitfeld aus.
Dann brauche ich für jede Aufgabe nur vier Zustände, das lässt sich mit 2 Bit also erreichen.

00 (0) = keine Farbe
01 (1) = grün
10 (2) = rot
11 (3) = gelb

Ich denke so eine Hardwarenahe Programmierung gefällt es dem System schon etwas besser.

Was meint ihr ?

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

14.01.2015, 13:20:59 via App

Das ist Komplett egal da musst du auch listen führen etc. Mein vorhaben klingt kompliziert ist es aber nicht. Die Farben sind dann als Integer gespeichert da die Color Konstanten Integrr sind. Wenn ich später Zeit habe schreibe ich dir mal ein Kleines Beispiel.

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

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

14.01.2015, 13:28:47 via Website

Hallo Pascal.

Ja das wäre super freundlich. Ich kann es mir nämlich gerade kaum vorstellen.

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

14.01.2015, 16:27:44 via Website

So ich habe jetzt mal eine Beispielkasse erstellt (nur Farbenlogik + zugehörige Listen):

public class ColorManager {


HashMap<Integer,Integer> _map = new HashMap<Integer,Integer>(); 
static HashMap<Integer,ColorManager> _managerMap = new HashMap<Integer,ColorManager>(); 





/**
 * Gibt die Farbe zu einem bestimten Key (Item) aus
 * @param key aktuelle Item Position
 * @return Color
 */
public int get(int key)
{
    if(_map.containsKey(key))
    {
        return _map.get(key);
    }
    return 0;
}

/**
 * Fügt ein Integer Wertepaar der liste hinz
 * @param pos aktuelle Position
 * @param color gewünschte Farbe
 */
public void add(int pos,int color)
{
    _map.put(pos, color);
}

/**
 * Gibt den zum Key gehörigen ColorManager aus
 * @param key  Postition
 * @return ColorManager Instanz
 */
public static ColorManager getColorManager(int key)
{
    if(_managerMap.containsKey(key))
    {
        return _managerMap.get(key);
    }
    return null;
}

/**
 * Fügt einen ColorManager zum Manager Array hinzu
 * @param key
 * @return
 */
public static ColorManager addColorManager(int key)
{
    ColorManager col = new ColorManager();
    _managerMap.put(key, col);
    return col;
}


/**
 * Aktualisiert einen Farbeitrag im Array
 * @param pos
 * @param color
 */
public void update(int pos,int color)
{
_map.remove(pos);
add(pos,color);

}

/**
 * Prüft ob ein Key in der Liste existiert
 * @param key zu prüfender Key
 * @return KeyExists
 */
public boolean keyExists(int key)
{
    return _map.containsKey(key);
}

}

Jetzt ist das eigentlich die komplette Logik die du dafür brauchst (ausgenommen speichern).

Kurze Benutzungsanleitung:

Beispiel MainActivity in der du eine ListView mit einigen Items hast (in deinem Fall jetzt):

Der ColorManger zum Verwalten der einzelnen Instanzen ist statisch integriert d.h. du kannst ganz einfach dem Manager Instanzen hinzufügen:

 ColorManager.addColorManager(0); //Hierbei steht die "0" für die Aktuelle ListView Item Position

Also wenn man jetzt duch alle ListVieItems iteriert:

 for (int i = 0; i < myList.getCount(); i++) {
ColorManager.addColorManager(i);
}

Bei click auf ein item musst du über ein intent deiner neuen Activity die aktuelle Item position mitteilen, damit diese Activity weiss welche Farbenliste sie nehmen muss. Sobald das geschenhen ist Code aus der neuen Acitivty:

        int i = getIntent().getIntExtra("deinKey", 0); //Listitem Position laden

   ColorManager cm =    ColorManager.getColorManager(i); //Den entsprechenden ColorManager laden

   ////// For every GridView Item ///// //Duch die GridViewItems Iterieren

   int key = 0; //Muss später die Pos des aktuellen Items sein

   int ItemColor = cm.get(key);
   //Item.setColor(itemColor);   wie auch immer der setColor befehl hier aussehen mag
   /////////End for////

Jetzt die letzte Hürde die 3. Activity in der die Farbe gesetzt werden soll.
Wie auch bei der letzten Act musst du da dann die Positionen als Intent Extra übergenben.
Diesmal sind es 2 Positionen nämlich einmal die Pos der ListView und dann die pos des GridView Items.
Sobald das Itent gestartet wird geht es in der anderen Activity weiter:

  int managerPos = getIntent().getIntExtra("manPos", 0);
   int ItemPos = getIntent().getIntExtra("ItemPos", 0);

   ColorManager colManager = ColorManager.getColorManager(managerPos);
   if(colManager.keyExists(ItemPos))
   {
   colManager.add(ItemPos, Color.BLUE); //Wenn die Farbe nicht existert dann hinzufügen
   }
   else
   {
    colManager.update(ItemPos, Color.BLACK);   //existiert sie schon, soll die nue Farbe übernommen werden.

   }

Den oberen Code kannst du dann ausfüheren und es wird die entsprechende Farbe gesetzt.
Am Anfang kann es noch zu Problemen kommen da ich den Code nicht getestet habe ;)
Zudem wird wahrscheinlich eine ArrayOutOfBounds Exception kommen da es die ganzen Item Farben noch nicht gibt, da muss man sich noch eine (vorrübergehende) Lösung überlegen, nachher sollen die Werte ja aus einer Datei etc. kommen.

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

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

16.01.2015, 17:16:23 via Website

WOW. Danke Pascal. Ich werde das sobald ich Zeit habe testen.

Vielen vielen Dank.

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

03.02.2015, 14:32:09 via Website

Prüfungen sind vorbei, jetzt kann ich mich wieder an die App ran machen.

Ich verstehe folgenden Kommentar nicht

   int ItemColor = cm.get(key);
   //Item.setColor(itemColor);   wie auch immer der setColor befehl hier aussehen mag
   /////////End for////

Wieso steht da End for. Das kommt doch nicht alles in die Iterierung durch die GridView, oder?

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

03.02.2015, 14:48:31 via Website

Doch das ist der Code der für jedes GridView Item ausgeführt werden muss:

  ////// For every GridView Item ///// //Duch die GridViewItems Iterieren

   int key = 0; //Muss später die Pos des aktuellen Items sein

   int ItemColor = cm.get(key);
   //Item.setColor(itemColor);   //wie auch immer der setColor befehl hier aussehen mag
   /////////End for////

Dabei zu beachten sind meine anmerkunegen ! ;)

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

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

03.02.2015, 17:14:08 via Website

Hallo Pascal,

so weit ist mir alles klar bin den Code jetzt Zeile für Zeile durchgegangen und habe fast alles verstanden. Nur stellt sich die Frage zum letzten Abschnitt deines vorgeschlagenen Codes.
In Worten gefasst:

   ColorManager colManager = ColorManager.getColorManager(managerPos);

Ich lade den ColorManager der meinem ListItem in der ersten Activity (den ich angeklickt habe) entspricht.

    if(colManager.keyExists(ItemPos))
   {
   colManager.add(ItemPos, Color.BLUE); //Wenn die Farbe nicht existert dann hinzufügen
   }
   else
   {
    colManager.update(ItemPos, Color.BLACK);   //existiert sie schon, soll die nue Farbe übernommen werden.

   }

Mit diesem Codeabschnitt, erstelle ich im Prinzip nur die Schlüssel Wert Paare. Aber ich setze nicht direkt die Farbe. Kannst du mir diesen Codeabschnitt besser erklären.

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

03.02.2015, 18:06:06 via Website

Was meinst du mit du setzt nicht direkt die Farbe?
Ich kann natürlich nicht alle wünsche berücksichtigen, den fehlenden Teil musst du noch programmieren.
Du meinst dass die Farbe nicht sofort auf das GridView Item oder in die Activity übernommen wird?
Das stimmt für das GridView musst du das in der onCreate bzw. onResume machen (die Farben setzen).
Für die Activity einfach die Farbe auf ein Feld deiner Wahl ( z.B. ActionBar) setzen.

Jetzt nochmal zurück zum Code:
[Ich habe da einen kleinen Fehler gemacht]

 if(!colManager.keyExists(ItemPos)) // <-- hier hatte ich das "!" vergessen heisst jetzt also not exists
   {
   colManager.add(ItemPos, Color.BLUE); //Wenn die Farbe nicht existert dann hinzufügen

/*

Bis hier hin klar?
Also prüfen ob schon eine Farbe für das Item gespeichert ist und wenn nein eine setzen (Hier kann dann auch eine andere beliebige Farbe rein, welche dann vom User gesetzt werden kann)

*/
}
else
{
colManager.update(ItemPos, Color.BLACK); //existiert sie schon, soll die nue Farbe übernommen werden.
/*

Wenn ein Farbeintrag schon verfügbar ist muss dieser eintrag geändertwerden (vorraussetzung: Farbe hat sich geändert)

*/

   }

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

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

04.02.2015, 10:01:20 via Website

Genau das war das Problem was mich durcheinander gebracht hat. Leider muss ich dir gestehen dass ich nicht verstehe wie ich durch die GridView iterieren soll?

Diese Iteration wie ich sie habe macht doch kein Sinn (in der onRestart)

for(int i = 0; i<gridView.getCount(); i++)
    {
        int key = index;
        int itemColor = cm.get(key);
        gridView.getChildAt(index).setBackgroundColor(itemColor);
    }

wobei index die position des GridView Items ist.

EDIT:
Ich glaube ich weiß jetzt was getan werden soll. Ich muss folgendermaßen iterieren.
Ich hole mir die ColorManager Liste mit folgender Zeile

        ColorManager cm = ColorManager.getColorManager(listItemPos);

nun habe ich im Prinzip eine leere HashMap (cm) für das angeklickte Item in der ersten Avtivity (ListActivity)

nun kommt die Iteration durch die GridView. Der Sinn ist nun diese HashMap cm zu befüllen mit den ganzen Items der GridView. Stimmts?

also:

for(int i = 0; i<gridView.getCount(); i++)
{
    cm.add(i); //GridView Items in cm hinzufügen
    int key = index;  //index ist die position des angeklickten Items in der GridView
    int itemColor = cm.get(key);  //falls der key (index) in cm verfügbar ist, was sie natürlich ist weil ich füge sie in der letzten Activity ein, dann
    //farbe übernehmen
    gridView.getChildAt(index).setBackgroundColor(itemColor);  //farbe hals hintergrund setzen in der GridView für das ausgewählte Item 
}

Ich hoffe ich hab es geschnallt

— geändert am 04.02.2015, 10:14:20

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

04.02.2015, 13:51:27 via Website

Also es funktioniert soweit alles und ich bedanke mich wirklich sehr für die Hilfe.
Die Farben werden in der letzten Activity gewählt und in der GridView Activity auch entsprechend richtig gesetzt.

Jetzt würde ich gerne den nächsten Schritt zum Speichern dieser Zustände gehen.

Pascal ich hoffe du kannst mir da weiter helfen. Es ist wirklich bald voll endet und ich danke dir sehr.

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

04.02.2015, 15:13:58 via Website

Das mit dem Speichern ist so eine Sache...
Du kannst es über SharedPrefs machen-> ist sehr umständlich da du alles in Stings oder Ints schreiben musst und das dann wieder richtig einlesen.

Ich würde die Objekt Klasse leiber Serialisieren und als File im internen Appspeicher speichern. Dann kannst du diesen jederzeit laden.
Um das serialisieren ersmal zu verstehen, würde ich dir emfehlen mal danach zu suchen und dich einzulesen, dann ist das nicht so kompliziert wie es auf den ersten Blick aussieht.

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

Antworten