Array mit Drawables in TypedArray umgewandelt und die ID rausfinden. Wie geht das?

  • Antworten:9
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 113

04.08.2014, 18:29:24 via Website

Ich habe in der ersten Activity 10 Items. Durch anklicken eines Items möchte ich ganz bestimmte drawables in die nächste Activity laden.

Diese Drawables sind in einem Array in xml deklariert (s.u.). Diese habe ich in einem TypedArray umgewandelt.
Jetzt möchte ich die richtigen Drawables über die einzelnen ID´s in die nächste Activity über einen Intent laden.

Hier ein Ausschnitt des Arrays in XML.

<resources>
<array name="aufgaben_drawable_array">
    <item>@drawable/aufgaben_app_1_001</item>
    <item>@drawable/aufgaben_app_1_002</item>
    <item>@drawable/aufgaben_app_1_003</item>
    <item>@drawable/aufgaben_app_1_004</item>
    <item>@drawable/aufgaben_app_1_005</item>
    <item>@drawable/aufgaben_app_1_006</item>
    <item>@drawable/aufgaben_app_1_007</item>
    <item>@drawable/aufgaben_app_1_008</item>
    <item>@drawable/aufgaben_app_1_009</item>
    <item>@drawable/aufgaben_app_1_010</item>
    <item>@drawable/aufgaben_app_1_011</item>
    <item>@drawable/aufgaben_app_1_012</item>
    <item>@drawable/aufgaben_app_1_013</item>
    <item>@drawable/aufgaben_app_1_014</item>
    <item>@drawable/aufgaben_app_1_015</item>
    <item>@drawable/aufgaben_app_1_016</item>
    <item>@drawable/aufgaben_app_1_017</item>
    <item>@drawable/aufgaben_app_1_018</item>
    <item>@drawable/aufgaben_app_1_019</item>
    <item>@drawable/aufgaben_app_1_020</item>
    <item>@drawable/aufgaben_app_1_021</item>
    <item>@drawable/aufgaben_app_1_022</item>
    <item>@drawable/aufgaben_app_2_023</item>
    <item>@drawable/aufgaben_app_2_024</item>
    <item>@drawable/aufgaben_app_2_025</item>
    <item>@drawable/aufgaben_app_2_026</item>
    <item>@drawable/aufgaben_app_2_027</item>
    <item>@drawable/aufgaben_app_2_028</item>
    <item>@drawable/aufgaben_app_2_029</item>
    <item>@drawable/aufgaben_app_2_030</item>
    <item>@drawable/aufgaben_app_2_031</item>
    <item>@drawable/aufgaben_app_2_032</item>
    <item>@drawable/aufgaben_app_2_033</item>
    <item>@drawable/aufgaben_app_2_034</item>
    <item>@drawable/aufgaben_app_2_035</item>
    <item>@drawable/aufgaben_app_2_036</item>
    <item>@drawable/aufgaben_app_2_037</item>
    <item>@drawable/aufgaben_app_3_038</item>
    <item>@drawable/aufgaben_app_3_039</item>
    <item>@drawable/aufgaben_app_3_040</item>
    <item>@drawable/aufgaben_app_3_041</item>
    <item>@drawable/aufgaben_app_3_042</item>

Hier wandle ich dieses Array in einem TypedArray.

TypedArray aufgabenDrawables = getResources().obtainTypedArray(R.array.aufgaben_drawable_array) 

In diesem TypedArray befinden sich verschiedene Daten für jedes Drawable, unter anderem auch die ID aller Drawables. Nun möchte ich nur die IDs in die nächste Activity übergeben.

Kann mir jemand helfen?

Antworten
  • Forum-Beiträge: 11.135

04.08.2014, 18:57:09 via Website

Ist diese ID die du bekommst schon ein Integer, wie es die Normalen Resoucen Ids sind?
Wenn ja musst du die ID einfach per intent übergeben und dann in der nächsten Activity lesen und behandeln.
Wenn ich mich richtig erinnere hattest du doch sowas schonmal gemacht oder?

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

Antworten
  • Forum-Beiträge: 113

04.08.2014, 19:15:29 via Website

ich gehe davon aus dass die ID ein integer ist und dieselbe wie die drawable id.

Das Problem ist, in dem TypedArray sind alle IDs meiner drawables beinhaltet. Ich brauche aber je nachdem welches item angeklickt wurde, die entsprechenden IDs (drawables).

Du erinnerst dich richtig, aber das Problem hatte ich nicht gelöst.

Ich habe eine halbe Lösung gefunden uzz. über eine for Schleife, aber die schleife fängt immer von Null an zu zählen, das heißt ich bekomme immer dieselben IDs in einem Array geladen.

Gibt es eine Möglichkeit das über die Zählvariable zu lösen. Das heißt sobald die Zählvariable "true" wird wird mein array gefüllt, sobald sie wieder false ist, wird nichts mehr gefüllt?

Hier meine kleine for Schleife:

for (int i = 0; i < sizeAufgabenFiltered; i++)
                resAufgabenDrawableIds.add(aufgabenDrawables.getResourceId(i,0))

            aufgabenDrawables.recycle()

Kannst du mir weiter helfen?

Antworten
  • Forum-Beiträge: 11.135

04.08.2014, 20:19:11 via Website

Ist das Definierte XML Array in deinem ersten Post Vollständig?
Wenn ja, ich habe da bei deiner Namensgebung ein Schema erkannt.
Die ersten 22 Elemente gehären dir Activity 1
von 23 - 37 zu Activity2 und so weiter
Nun gibt es 2 Möglichkeiten:
1. Du lässt das Array über eine Schleife in die Activity zugrhörikeit sortieren
2. Du definierst für jede Activity im XML ein eigenes Array, dann keine sortierarbeit sondern nur noch das richtige Array übergeben.

Welche dieser Möglichkeiten ziehst du vor?Die 2. ist die einfachere aber wenn du es über den Code lösen willst, dann mache es weiterhin über deine schleife:

//Range Def: Definition der Arrayzonen

int act1= 21; //Für die ersten 22 elemente (!0 element bei schleifen nicht vergessen)
int act2 = 36;
int act3 = 41;

for (int i = 0; i < sizeAufgabenFiltered; i++)
{

            if(i<= act1)
            {
            //zum array f&uuml;r die drawables der ersten Activity
            }

            else if(i<=act2)
            {
                //zum array f&uuml;r die drawables der zweiten Activity
            }

            else if(i<=act3)
            {
                //zum array f&uuml;r die drawables der dritten Activity
            }




            }

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

Antworten
  • Forum-Beiträge: 113

05.08.2014, 08:45:35 via Website

Mein Array ist nich vollständig die laufende zahl geht bis zu ca 200. Und diese sind in 10 verschiedenen Items aufgeteilt. Ich möchte ungern für jedes XML Array eine neue activity erstellen. Ich bevorzuge die 1. Möglichkeit.

Ich verstehe diese Schleife nicht wirklich. Was ist wenn ich zwei Activitys habe, mit der gleichen Anzahl an drawables. Funktioniert diese Schleife noch?

Danke im Voraus

EDIT:
Kann ich das nicht über ein Stringvergleich machen und dann wieder zurück umwandeln in einem int.

Zum Beispiel:

for(String s : aufgabenDrawables){
                if(s.contains(pos2string)) {
                    array.add(s)
                }
            }

Ich weiß nur nicht ob ich es dann wieder zurück umwandeln kann ohne eine Datenverfäschung zu bekommen

EDIT2:

noch eine Idee.

Gibt es eine Möglichkeit den Arraynamen mit einem String zu vergleichen und wenn es mit der position zutrifft dann lade ich einfach den array.

Das ist ja ein Ausschnitt meines arrays mit ALLEN drawables.

<resources>

<array name="aufgaben_drawable_array">
<item>@drawable/aufgaben_app_1_001</item>
<item>@drawable/aufgaben_app_1_002</item>
<item>@drawable/aufgaben_app_1_003</item>
<item>@drawable/aufgaben_app_1_004</item>
<item>@drawable/aufgaben_app_1_005</item>
<item>@drawable/aufgaben_app_1_006</item>
<item>@drawable/aufgaben_app_1_007</item>
<item>@drawable/aufgaben_app_1_008</item>
<item>@drawable/aufgaben_app_1_009</item>
<item>@drawable/aufgaben_app_1_010</item>
<item>@drawable/aufgaben_app_1_011</item>
<item>@drawable/aufgaben_app_1_012</item>
<item>@drawable/aufgaben_app_1_013</item>
<item>@drawable/aufgaben_app_1_014</item>
<item>@drawable/aufgaben_app_1_015</item>
<item>@drawable/aufgaben_app_1_016</item>
<item>@drawable/aufgaben_app_1_017</item>
<item>@drawable/aufgaben_app_1_018</item>
<item>@drawable/aufgaben_app_1_019</item>

Meine idee sollte so aussehen:
<array name="aufgaben_drawable_array_1">
<item>@drawable/aufgaben_app_1_001</item>
<item>@drawable/aufgaben_app_1_002</item>
<item>@drawable/aufgaben_app_1_003</item>
<item>@drawable/aufgaben_app_1_004</item>
<item>@drawable/aufgaben_app_1_005</item>
<item>@drawable/aufgaben_app_1_006</item>
<item>@drawable/aufgaben_app_1_007</item>
<item>@drawable/aufgaben_app_1_008</item>
<item>@drawable/aufgaben_app_1_009</item>
<item>@drawable/aufgaben_app_1_010</item>
<item>@drawable/aufgaben_app_1_011</item>
<item>@drawable/aufgaben_app_1_012</item>
<item>@drawable/aufgaben_app_1_013</item>
<item>@drawable/aufgaben_app_1_014</item>
<item>@drawable/aufgaben_app_1_015</item>
<item>@drawable/aufgaben_app_1_016</item>
<item>@drawable/aufgaben_app_1_017</item>
<item>@drawable/aufgaben_app_1_018</item>
<item>@drawable/aufgaben_app_1_019</item>
<item>@drawable/aufgaben_app_1_020</item>
<item>@drawable/aufgaben_app_1_021</item>
<item>@drawable/aufgaben_app_1_022</item>

<array name="aufgaben_drawable_array_2">
<item>@drawable/aufgaben_app_2_023</item>
<item>@drawable/aufgaben_app_2_024</item>
<item>@drawable/aufgaben_app_2_025</item>
<item>@drawable/aufgaben_app_2_026</item>
<item>@drawable/aufgaben_app_2_027</item>
<item>@drawable/aufgaben_app_2_028</item>
<item>@drawable/aufgaben_app_2_029</item>
<item>@drawable/aufgaben_app_2_030</item>
<item>@drawable/aufgaben_app_2_031</item>
<item>@drawable/aufgaben_app_2_032</item>
<item>@drawable/aufgaben_app_2_033</item>
<item>@drawable/aufgaben_app_2_034</item>
<item>@drawable/aufgaben_app_2_035</item>
<item>@drawable/aufgaben_app_2_036</item>
<item>@drawable/aufgaben_app_2_037</item>

<array name="aufgaben_drawable_array_3">
<item>@drawable/aufgaben_app_3_038</item>
<item>@drawable/aufgaben_app_3_039</item>
<item>@drawable/aufgaben_app_3_040</item>
<item>@drawable/aufgaben_app_3_041</item>
<item>@drawable/aufgaben_app_3_042</item>

Ich hoffe ich hab das verständlich erklärt.

— geändert am 05.08.2014, 09:20:51

Antworten
  • Forum-Beiträge: 11.135

05.08.2014, 09:59:39 via Website

Also das was du im Edit gepostet hast, ist ja meine 1. Möglichkeit.
Dann musst du nur das richtige Array im Intent übergeben.
Somit hast du doch einzelne Arrays was willst du mehr?

Zudem kannst du das und Solltest das nicht über den String vergleich lösen.
Zudem bekommst du keinen String aus dem Array da du die Schreibweise @drawable verwendest.

Warum verstehst du die Schleife nicht?

int act1= 21; //F&uuml;r die ersten 22 elemente (!0 element bei schleifen nicht vergessen) 

int act2 = 36;
int act3 = 41;

for (int i = 0; i < sizeAufgabenFiltered; i++)
{
if(i<= act1)
{
//Der Index i ligt im bereich zwischen 0 und 21
//Dadurch kannst du feststellen ob die Schleife gerade die Elemente für die Erste Activity verarbeitet
//hier kannst du dann die Drawables zu dem richtigen Array hinzufügen.
}

        else if(i<=act2)
        {
            //zum array f&amp;uuml;r die drawables der zweiten Activity
            //Das gleiche gilt hier.
            //F&uuml;r die Drawables der 2. Activity
        }

        else if(i<=act3)
        {
            //zum array f&amp;uuml;r die drawables der dritten Activity
        }




        }

Im Prinzip durchläufst du über die Schleife dein großes Array und bestimmst über den Index die Position im Drawables Array.
Und die Position und die Kenntnis über das Array kannst du bestimmen in welche Activity die durchlaufenen Drawables gehören.

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

Antworten
  • Forum-Beiträge: 113

05.08.2014, 11:00:01 via Website

aber die Schleife beginnt jedes mal bei Null an zu zählen. Die Zählvariable i ist ja immer kleiner als mein wert act.

int act1 = 21;
int act2 = 36;

for (int i = 0; i < sizeAufgabenFiltered; i++){
                if(i<=act1){
                    resAufgabenDrawableIds.add(aufgabenDrawables.getResourceId(i,0))
                }
                else if(i<=act2){
                    resAufgabenDrawableIds.add(aufgabenDrawables.getResourceId(i,0))
                }

            }

Verstehst du mein Problem?

Antworten
  • Forum-Beiträge: 11.135

05.08.2014, 11:58:25 via Website

Ja schon aber irgendwann geht das doch raus:
for( int i=0;i<aufgabenDrawables;i++)

hier mal den Programm ablauf den ich erwarte (in der Theorie)

i ist 0, dann springt er in die 1. if rein.Dort wird dann der Wert dem sortierten Array hinzugefügt.

.
.
.

i ist 22, dann ist die erste if ungültig und die 2. wird ausgeführt und so weiter.

Zudem ist mir unklar warum du in der Schleife die IDs immer zu resAufgabenDrawableIds hinzufügst.
Du brauchst doch dann für jede Activity ein eigenes Array:

for (int i = 0; i < aufgabenDrawables; i++){
            if(i<=act1){
                resAufgabenDrawableIdsFuerAct1.add(aufgabenDrawables.getResourceId(i,0))
            }
            else if(i<=act2){
                resAufgabenDrawableIdsFuerAct2.add(aufgabenDrawables.getResourceId(i,0))
            }

        }

PS: wie wird die Variable sizeAufgabenFiltered gesetztß
Diese muss die länge des großen Array enthalten also mindestens 46;

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

Antworten
  • Forum-Beiträge: 113

05.08.2014, 12:25:47 via Website

ich hab das jetzt so ähnlich gelöst.

for (int i = 0; i < sizeAufgabenDrawables ; i++){
                if(i > act9 &amp;&amp; i <= act10){
                    resAufgabenDrawableIds_10.add(aufgabenDrawables.getResourceId(i,0))
                    aufgabenDrawables.recycle()
                }
                else if(i > act8 &amp;&amp; i <= act9){
                    resAufgabenDrawableIds_9.add(aufgabenDrawables.getResourceId(i,0))
                    aufgabenDrawables.recycle()
                }
                else if(i > act7&amp;&amp; i <= act8){
                    resAufgabenDrawableIds_8.add(aufgabenDrawables.getResourceId(i,0))
                    aufgabenDrawables.recycle()
                }

usw.

eine Frage hätte ich noch.

Brauche ich nach jeder if Anweisung dieses

aufgabenDrawables.recycle()

oder reicht es mir einmal am ende der for Schleife.

Ich wollte mich bedanken, dass du mich zum Ziel geführt hast! :)

Antworten
  • Forum-Beiträge: 11.135

05.08.2014, 12:34:26 via Website

Ich glaube das Recycle reicht, das du das am ende machst.
Sonst merkst du es und machst halt noch mehr recycle Befehle rein.

Kein Problem :)
Die Idee zählt, man muss nur irgendwie drauf kommen.

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

Antworten