# String Array Pfad in Int setzen



## wer112 (26. Nov 2022)

Ich habe ein Problem, was ich nicht über Stackoverflow finden konnte.
Ich hole mir aus der Datenbank Bild Pfade, die in der App als Bild Datei gespeichert sind.

In der Datenbank steht da: R.drawable.bild. 

Diese lade ich erfolgreich in ein String Array.

Für Bilder einer ListView braucht man ein Int.

Normalerweiße steht da: int[] bilder = {R.drawable.bild, R.drawable.bild2}
Diesen Int übergibt man ja an den Adapter.

Wie kann ich also ein String Array([R.drawable.bild, R.drawable.bild2, R.drawable.bild3, R.drawable.bild4]) die Wörter in den Int setzen.
Manuell kann man das machen, da haben die Bilder auch richtig angezeigt.

Habe im Internet die Variante entdeckt, wo meine App abgestürzt ist:

images = ein Int, image = String Array

images = new int[image.length];
for(int i =0; i < image.length ; i++) {
    images_ = Integer.parseInt(image);
}

Hat jemand eine Idee, wie man das machen muss, damit es klappt?

bei Kleinen Apps(Mini Projekte) tue ich ja alle Bilder in die App rein, da es Zeit und Daten spart.

Ich freue mich auf euere Vorschläge =)_


----------



## Jw456 (26. Nov 2022)

Da musst du schon die „ID“ „int“ in der DB Speichern nicht den symbolischen für dem Meschen gut lesbaren String.

Den übersetz dir der Compiler in den "int / ID" ,  zur Laufzeit wird mit dem „int“ gearbeitet nicht mit dem String. 
Der ist dann in der App nicht mehr vorhanden.


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> Da musst du schon die „ID“ „int“ in der DB Speichern nicht den symbolischen für dem Meschen gut lesbaren String.
> 
> Den übersetz dir der Compiler in den "int / ID" ,  zur Laufzeit wird mit dem „int“ gearbeitet nicht mit dem String.
> Der ist dann in der App nicht mehr vorhanden.


Wie kann ich das als Int Speichern, gibt es da ne Webseite die das kann?

Also wenn int xyz[] = {R.drawable.bild, R.drawable.bild2}; Übersetzt er diese automatisch in Zahlen, obwohl da Wörter drinnen steht.

Ich habe das Probiert:

String testString[] = {"R.drawable.bild1", "R.drawable.bild2", "R.drawable.bild3"};
int test[] = Integer.parseInt(testString); 

rot makiert, da ich ja das in Zahlen ja umwandeln muss.
In der Datenbank wird es einfach unmöglich, wenn man kein online Umwandler hat.

Deswegen wäre es ja schön, wenn ich es in der App umwandeln könnte. 

Aslo ein String Array parsen zu einem Int Array.


----------



## mihe7 (26. Nov 2022)

wer112 hat gesagt.:


> Wie kann ich das als Int Speichern, gibt es da ne Webseite die das kann?


???



wer112 hat gesagt.:


> int xyz[] = {R.drawable.bild, R.drawable.bild2}; Übersetzt er diese automatisch in Zahlen, obwohl da Wörter drinnen steht.


Da stehen keine Wörter sondern Bezeichner, die für int-Werte stehen.



wer112 hat gesagt.:


> String testString[] = {"R.drawable.bild1", "R.drawable.bild2", "R.drawable.bild3"};


_Hier _stehen nun Wörter, die keinerlei Bedeutung für die Anwendung haben.



wer112 hat gesagt.:


> In der Datenbank wird es einfach unmöglich, wenn man kein online Umwandler hat.


Musst Du ja nicht. Ich weiß jetzt nicht, ob die IDs von Android stabil sind. Wenn ja, kannst Du einfach die IDs in die DB ablegen, ansonsten kannst Du in einer Map Strings auf IDs abbilden:

```
Map<String, Integer> resources = new HashMap<>();
...
resources.put("R.drawable.bild1", R.drawable.bild1);
resources.put("R.drawable.bild2", R.drawable.bild2);
usw.
```

Dann kannst Du Dir per `resources.get(dbString)` die ID geben lassen.


----------



## wer112 (26. Nov 2022)

mihe7 hat gesagt.:


> ???


Damit ich für R.drawable.bild eine Tahlenvolge erhalte und diese dann irgendwie an den Int übergeben lassenkann


mihe7 hat gesagt.:


> Da stehen keine Wörter sondern Bezeichner, die für int-Werte stehen.
> 
> 
> _Hier _stehen nun Wörter, die keinerlei Bedeutung für die Anwendung haben.


Die Bedeutung muss ja entstehen, das so umzubauen, das der Int Array weiß wie die Bilder heißen, um an den Adapter übergeben zu können.


mihe7 hat gesagt.:


> Musst Du ja nicht. Ich weiß jetzt nicht, ob die IDs von Android stabil sind. Wenn ja, kannst Du einfach die IDs in die DB ablegen, ansonsten kannst Du in einer Map Strings auf IDs abbilden:


Bei dem Mini übungsprojekt befinden sich alle Bilder im drawable Ordner. Die Datenbank sagt welche davon aktive sind und angezeigt werden muss. Deswegen übergebe ich den Namen, wie die datei heißt, um darauf zu zugreifen. 
Oder soll ich nur bild in db abspeichern ohne R.drawable;


mihe7 hat gesagt.:


> ```
> Map<String, Integer> resources = new HashMap<>();
> ...
> resources.put("R.drawable.bild1", R.drawable.bild1);
> ...


Das mit der Map verstehe ich überhaupt nicht. 
Ich weiß nicht welche Bilder ich nehmen muss, da dies die datenbank mitteilt. 
Es muss allso dynamisch sein.


----------



## KonradN (26. Nov 2022)

wer112 hat gesagt.:


> Das mit der Map verstehe ich überhaupt nicht.
> Ich weiß nicht welche Bilder ich nehmen muss, da dies die datenbank mitteilt.
> Es muss allso dynamisch sein.


Das ist doch die Idee hinter der Map. In der map verwaltest Du, welche Bilder es gibt und weist jedem Bild einen Namen zu.

Dann kann die Datenbank sagen "R.drawable.bild1" und über die Map kannst Du dann die Id dieser Ressource bekommen (Die in R.drawable.bild1 erzeugt wurde).

Aber das dürfte nicht einmal notwendig sein. Wenn Du den Namen und den Typ einer Resource kennst, dann kannst Du auch zur Laufzeit darauf zugreifen:
a) Context.getResources(): https://developer.android.com/reference/android/content/Context#getResources()
b) Resources.getIdentifier: https://developer.android.com/refer...g.String, java.lang.String, java.lang.String)

Damit bekommt Du den Identifier, wenn Du Name, type unf package angibst.
Dabei ggf. bezüglich der Parameter diesen SO Thread ansehen: https://stackoverflow.com/questions/15488238/using-android-getidentifier


----------



## wer112 (26. Nov 2022)

KonradN hat gesagt.:


> Das ist doch die Idee hinter der Map. In der map verwaltest Du, welche Bilder es gibt und weist jedem Bild einen Namen zu.
> 
> Dann kann die Datenbank sagen "R.drawable.bild1" und über die Map kannst Du dann die Id dieser Ressource bekommen (Die in R.drawable.bild1 erzeugt wurde).


Und die Map kann ein String Array laden und mehrere Ids auf einmal ausgeben?


KonradN hat gesagt.:


> Aber das dürfte nicht einmal notwendig sein. Wenn Du den Namen und den Typ einer Resource kennst, dann kannst Du auch zur Laufzeit darauf zugreifen:
> a) Context.getResources(): https://developer.android.com/reference/android/content/Context#getResources()


Müsste ich mal ausprobieren, ob das auch im Fragment klappt. Ich bekomme ja von der Datenbank den Array: R.drawable.bild1, R.drawable.bild3,...
somit weiß ich ja wie die heißen. Muss den String Array alles in den Integer array packen.
könnte man int i[] bild = Context.getResources(Stringarray); machen?


KonradN hat gesagt.:


> b) Resources.getIdentifier: https://developer.android.com/reference/android/content/res/Resources.html#getIdentifier(java.lang.String, java.lang.String, java.lang.String)


Werde es mal anschauen.


KonradN hat gesagt.:


> Damit bekommt Du den Identifier, wenn Du Name, type unf package angibst.
> Dabei ggf. bezüglich der Parameter diesen SO Thread ansehen: https://stackoverflow.com/questions/15488238/using-android-getidentifier


Habe die Bilder einzeln in ein Integer umgewandelt und die ID in der db abgespeichert, jetzt geht es, aber das soll ja nicht die lösung sein, denn ich müsste ja für jedes Bild neu compilen und es ausgeben lassen. Da wird ja mehr sehr vielen Bilder sehr langwirig sein.

Habe dasso einzeln gemacht: int id = Integer.parseInt(String.valueOf(R.drawable.bild1));
und ich hoffe(was irgendwie möglic sein kann) nicht Millionen Bilder einzeln zu compilieren, damit ich von jedem einzelnen Bild die ID erhalte und manuell in die DB eintrage.

Währe es mit eine Schleife möglich, dass ich den String Array über die Schleife laufen lasse un da jeden einzelnen Teil vom String in ein int verwandle und diese zum int[] xyz hinzufügen kann?

wie evtl. ne for schleife? Könnte mir das evtl. vorstellen, aber ich kenne mich jetzt net so gut aus.

das ich xyz.add(die erstellte ID) zum int[] hinzufügen kann?


----------



## mihe7 (26. Nov 2022)

Jetzt hat Dir @KonradN doch schon einen Link auf die Lösung (SO) gepostet, das kann man noch in eine Methode klatschen:

```
private int getDrawableId(String drawableName) {
    return YourActivity.this.getResources().getIdentifier(
        drawableName,
        "drawable",
        YourActivity.this.getPackageName()
   );
}
```
und schon kannst Du Dir für den Namen eines Drawables (z. B. "bild1") die Ressourcen-ID geben lassen.


----------



## wer112 (26. Nov 2022)

mihe7 hat gesagt.:


> Jetzt hat Dir @KonradN doch schon einen Link auf die Lösung (SO) gepostet, das kann man noch in eine Methode klatschen:
> 
> ```
> private int getDrawableId(String drawableName) {
> ...


Geht es auch mit nem String Array?


----------



## Jw456 (26. Nov 2022)

wer112 hat gesagt.:


> Das mit der Map verstehe ich überhaupt nicht.
> Ich weiß nicht welche Bilder ich nehmen muss, da dies die datenbank mitteilt.
> Es muss allso dynamisch sein.


„R „ ist eine Java Klasse die Android Studio selber anlegt. Das ist kein String .

Das ist nichts dynamisch zur Laufzeit.


----------



## mihe7 (26. Nov 2022)

wer112 hat gesagt.:


> Geht es auch mit nem String Array?




```
private int[] getDrawableIds(String[] drawableNames) {
    int[] ids = new int[drawableNames.length];
    for (int i = 0; i < drawableNames.length; i++) {
        ids[i] = getDrawableId(drawableNames[i]);
    }
}
```
Oder, wenn die API es hergibt:

```
private int[] getDrawableIds(String[] drawableNames) {
    return Arrays.stream(drawableNames).mapToInt(this::getDrawableId).toArray();
}
```


----------



## Jw456 (26. Nov 2022)

Wozu der ganze Aufwand mit der DB.

Dein Res Ordner besser der Drawable Ordner den du der App mit gibst verändert sich auch nicht zur Laufzeit. Der ist auch nur lesbar und nicht schreibbar.

Du kannst da zb. keine Bilder zur Laufzeit hinzufügen.


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> Wozu der ganze Aufwand mit der DB.
> 
> Dein Res Ordner besser der Drawable Ordner den du der App mit gibst verändert sich auch nicht zur Laufzeit. Der ist auch nur lesbar und nicht schreibbar.
> 
> Du kannst da zb. keine Bilder zur Laufzeit hinzufügen.


Das problem ist, das ich ja nur CardViews angezeigt werden soll, die Aktiv sind. Wenn ein Produkt nicht gibt, kann ich doch nicht manuell die Bilder drinnen lassen, da sonst der StringArray mit dem Adapter durcheinander kommt. In der Datenbank stellt man ein, ob was aktive ist oder nicht. wenns aktive ist, dann erhalte ich die Info. Wenn man alle Bilder einbindet, aber nur ein Produkt in die Liste setzten möchte, würde es ja Abstürtzen.


----------



## Jw456 (26. Nov 2022)

Wie ich sagte kannst du die Bilder in den Drawable Ordner zur Laufzeit der App nicht verändern.

Außer du erstellt jedes Mal wenn sich was ändert eine neue Apk und du gibst sie dem User. Nicht sinnvoll.

Dann halte die Bilder in deiner Online DB. Und der User liest die dann aus der DB oder dem Online Filestore für die Anzeige.


----------



## wer112 (26. Nov 2022)

mihe7 hat gesagt.:


> ```
> private int[] getDrawableIds(String[] drawableNames) {
> int[] ids = new int[drawableNames.length];
> for (int i = 0; i < drawableNames.length; i++) {
> ...


Leider gibt es bei mir keine getDrawableId. kann ich nur getDrawable benutzen?


----------



## Jw456 (26. Nov 2022)

wer112 hat gesagt.:


> Leider gibt es bei mir keine getDrawableId. kann ich nur getDrawable benutzen?


das ist die Methode aus post #8


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> das ist die Methode aus post #8


Sorry bin dafür einfach zu doof.

private int[] getDrawableId(String[] image) {
    images = new int[image.length];
    for (int i = 0; i <= image.length; i++){
        images_ = getDrawableId(image);

    }

    return images;
}_


----------



## Jw456 (26. Nov 2022)

```
private int[] getDrawableId(String[] image) { // hier willst du doch getDrawableIds "s" erstellen
        images = new int[image.length];  // kein Datentyp angegeben
        for (int i = 0; i <= image.length; i++){
            images = getDrawableId(image);  // images ist ein Array
        }
```


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> ```
> private int[] getDrawableId(String[] image) { // hier willst du doch getDrawableIds "s" erstellen
> images = new int[image.length];  // kein Datentyp angegeben
> for (int i = 0; i <= image.length; i++){
> ...


zeigt mir fast alles rot an


----------



## Jw456 (26. Nov 2022)

```
private int[] getDrawableIds(String[] image) {
        int[] images = new int[image.length];
        for (int i = 0; i <= image.length; i++){
            images[i] = getDrawableId(image[i]);
      
        }
.....

}
//---------------------------------
private int getDrawableId(String drawableName) {
    return YourActivity.this.getResources().getIdentifier(
        drawableName,
        "drawable",
        YourActivity.this.getPackageName()
   );
}
```


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> ```
> private int[] getDrawableIds(String[] image) {
> int[] images = new int[image.length];
> for (int i = 0; i <= image.length; i++){
> ...


Ich gebe auf, alles rot, nixs funktioniert. 

Muss jedes Bild einzeln die ID rausziehen, was etwas dauert, da eine Schleife auch nicht funktioniert, wie gedacht.

Dachte ich nehme eine for Schleife, Lass den String Array durchlaufen, und für jeden String die ID rausfinden und die zum Integer hinzufügen. 

Habe mit einer Liste probiert, bin eben gescheitert.

Der Code von dir will nen return haben, dann eine Klammer und nachdem ich das ca. getan habe, fängt getDrawableID an rot zu leuchten.

Ich danke für deine Bemühungen


----------



## Jw456 (26. Nov 2022)

Natürlich will es ein Return . Du sollst natürlich auch was machen und mitdenken.
Den Return hattest du ja schon selber.

Ich habe ja auch …. Was soviel heißt hier kommt oder fehlt noch was.



 Das zeigt mir das du einfach nur Kopierst ohne es selber verstanden zu haben


----------



## Jw456 (26. Nov 2022)

Mit "YourActivity"  hat  mihle7  auch den Name deiner Activity gemeit. Den wir ja nicht kennen.
Hoffe du hast das geändert und nicht einfach nur Kopiert.


----------



## Jw456 (26. Nov 2022)

mihe7 hat gesagt.:


> Jetzt hat Dir @KonradN doch schon einen Link auf die Lösung (SO) gepostet, das kann man noch in eine Methode klatschen:
> 
> ```
> private int getDrawableId(String drawableName) {
> ...


ist auch nicht richtig sinnvoll in einem Fragment.

besser so

```
private int getDrawableId(String drawableName) {
        int drawable = getActivity().getResources().getIdentifier(
                drawableName,
                "drawable",

                getActivity().getPackageName()
        );
        return drawable;
    }
```


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> Natürlich will es ein Return . Du sollst natürlich auch was machen und mitdenken.
> Den Return hattest du ja schon selber.
> 
> Ich habe ja auch …. Was soviel heißt hier kommt oder fehlt noch was.
> ...


Ich kann eben nur das machen, was zeigt. ICh habe natürlich die fehlende Klammer gesetzt und so. 
Egal was ich tue, es zeigt Fehler an beim getDrawableiD(image_); 

Das andere zeigt keine Fehler an, aber stürtzt die App ab.
dachte die Schleife geht den String array durch und jedes Element daraus, wandle ich in ein ID um. 
Also Einzeln kein Problem, aber so...

ICh bin persöhnlich grade Überfordert.

Das ist das einzigste, wo keine Fehler bei mir anzeigt und Abstürtzt.

private Integer[] getDrawableIds(String[] image) {
    images = new Integer[image.length];
    for (int i = 0; i <= image.length; i++) {
        images = Integer.parseInt(image);

    }
    return images;
}_


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> Mit "YourActivity"  hat  mihle7  auch den Name deiner Activity gemeit. Den wir ja nicht kennen.
> Hoffe du hast das geändert und nicht einfach nur Kopiert.


Ich muss da getActivity benutzen, da ich im Fragment bin.


----------



## Jw456 (26. Nov 2022)

wer112 hat gesagt.:


> Ich muss da getActivity benutzen, da ich im Fragment bin.


Ja das habe ich ja auch im letzten Beitrag gesagt. Das der Code von mihe7 nicht geht. 

In einem Fragment.


----------



## Jw456 (26. Nov 2022)

Poste Code im Code Block


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> Poste Code im Code Block


Also kein eigene Methode?


```
private int[] getDrawableId(String[] image) {
    images = getActivity().getResources().getIdentifier(
            image,
            "drawable",

            getActivity().getPackageName()
    );
    return images;
}
```
oder muss das in ne for Schleife?


----------



## httpdigest (26. Nov 2022)

Wow, das tut ja fast schon weh... 
Er meint mit "Poste Code im Block" dass du Code nicht einfach nur Copy&Paste in den Editor vom java-forum kopieren sollst, sondern innerhalb des dafür extra hier im Editor von java-forum vorhandenen Elementes "</>" (erster Button ganz links im Editor, wenn du hier im java-forum etwas schreibst).


----------



## wer112 (26. Nov 2022)

httpdigest hat gesagt.:


> Wow, das tut ja fast schon weh...
> Er meint mit "Poste Code im Block" dass du Code nicht einfach nur Copy&Paste in den Editor vom java-forum kopieren sollst, sondern innerhalb des dafür extra hier im Editor von java-forum vorhandenen Elementes "</>" (erster Button ganz links im Editor, wenn du hier im java-forum etwas schreibst).


Aso xD xD Besser jetzt?


----------



## Jw456 (26. Nov 2022)

Frage wo hast du die Variable "images" deklariert, erstellt?

Und "image" ist ein Array du willst da drüber interiren und wie machst man das? Wie greift man auf ein einzelnes Element von einem Array zu? Das sollte dir bekannt sein. 
Wurde doch nun auch zur genüge gezeigt.


----------



## mihe7 (26. Nov 2022)

Gut, dass ich nicht am Rechner war


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> Frage wo hast du die Variable "images" deklariert, erstellt?




```
public class --- extends Fragment {

    String produkte[] = {}; 
    String produkt_art[] = {};
    String produkt_titel[];
    String produkte_beschreibung[] = {};
    String produkt_preis[]; 
    String produkt_aktiv[] = {};
    ListView listView;

    String image[] = {};

    JSONArray prod = null;
    JSONArray prod_tit = null;
    JSONArray prod_be = null;
    JSONArray prod_pr = null;
    JSONArray prod_ima = null;
```

In der Volley umwandlung:


```
try {



                    prod = response.getJSONArray("produkte");
                    prod_tit = response.getJSONArray("produkt_titel");
                    prod_be = response.getJSONArray("produkt_beschreibung");
                    prod_pr = response.getJSONArray("produkt_preis");
                    prod_ima = response.getJSONArray("produkt_images");


                    Log.e("Produkte:", "" + prod);
                    Log.e("Preise:", "" + prod_pr);
                    Log.e("Images:", "" + prod_ima);

                    if (prod != null
                            && prod.length() > 0
                            && prod_tit != null
                            && prod_tit.length() > 0
                            && prod_be != null
                            && prod_be.length() > 0
                            && prod_pr != null
                            && prod_pr.length() > 0
                            && prod_ima != null
                            && prod_ima.length() > 0) {

                        Log.e("Leer Prüfung", "klappt hier alles");

                        List<String> prod_titel_list = new ArrayList<String>();
                        for (int i=0; i<prod_tit.length(); i++) {
                            prod_titel_list.add(prod_tit.getString(i));
                        }
                        produkt_titel = prod_titel_list.toArray(new String[prod_titel_list.size()]);

                        List<String> prod_preis_list = new ArrayList<String>();
                        for (int i=0; i<prod_pr.length(); i++) {
                            prod_preis_list.add( prod_pr.getString(i) );
                        }
                        produkt_preis = prod_preis_list.toArray(new String[prod_preis_list.size()]);


                        List<String> prod_image_list = new ArrayList<String>();
                        for (int i=0; i<prod_ima.length(); i++) {
                            prod_image_list.add(prod_ima.getString(i) );
                        }
                        image = prod_image_list.toArray(new String[prod_image_list.size()]);
```



Jw456 hat gesagt.:


> Und "image" ist ein Array du willst da drüber interiren und wie machst man das? Wie greift man auf ein einzelnes Element von einem Array zu? Das sollte dir bekannt sein.


Soweit wie ich in der erinnerung habe ca. so: image[2]; wäre das 3 Element des Arrays.
Oder müste ich es in die Schleife packen?


----------



## Jw456 (26. Nov 2022)

Meine frage hast du nicht beantwortet.
Ich habe nach "images" gefragt "s".
Das Array was du in der Methode neu erstellt und zurück geben willst.
Was übrigens vom Typ int sein muss. 




Ich merke das Fürt zu nichts hier.

Ich denke du gehst nochmal zurück zu den Java Grundlagen.


----------



## mihe7 (26. Nov 2022)

wer112 hat gesagt.:


> Ich kann eben nur das machen, was zeigt.


Nein, man kann Dinge auch auf seinen Fall anpassen. Woher soll z. B. irgendjemand denn wissen, dass Du in einem Fragment unterwegs bist? Dann musst Du den Code nehmen und anpassen, ggf. mal in SO nachschauen: https://stackoverflow.com/a/17763962/19657183. Hinzu kommt, dass ich den Code vorher nicht auch noch teste, sondern hier im Editor reinklopfe, d. h. dass da Fehler enthalten sein können, ist ganz normal. Eigentlich hätten die Links, die Dir @KonradN gegeben hat, reichen müssen. Ein klein wenig Eigeninitiative darf schon sein


----------



## wer112 (26. Nov 2022)

Jw456 hat gesagt.:


> Meine frage hast du nicht beantwortet.
> Ich habe nach "images" gefragt "s".


Sorry eine Zeile so wenig kopiert:


```
public class --- extends Fragment {

    String produkte[] = {};
    String produkt_art[] = {};
    String produkt_titel[];
    String produkte_beschreibung[] = {};
    String produkt_preis[];
    String produkt_aktiv[] = {};
    ListView listView;

    String image[] = {};

    JSONArray prod = null;
    JSONArray prod_tit = null;
    JSONArray prod_be = null;
    JSONArray prod_pr = null;
    JSONArray prod_ima = null;

    String pic = image.toString();

    int[] images = {};



    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
```



Jw456 hat gesagt.:


> Ich denke du gehst nochmal zurück zu den Java Grundlagen.


In den Grundlagen lernt man keine Umwandlung vom String Array zu einem Int Array. 
Da ich sowas noch nie gemacht habe, muss ich das ja lernen und das geht mit "lerning by doing"


----------



## mihe7 (26. Nov 2022)

wer112 hat gesagt.:


> In den Grundlagen lernt man keine Umwandlung vom String Array zu einem Int Array.


Man lernt, mit Arrays und Methoden umzugehen. Das reicht, um ein String-Array in ein int-Array zu konvertieren. Den Code dazu hast Du übrigens von mir schon in #11 bekommen (im ersten fehlt ein `return ids;` nach Zeile 5).


----------



## wer112 (26. Nov 2022)

mihe7 hat gesagt.:


> Nein, man kann Dinge auch auf seinen Fall anpassen. Woher soll z. B. irgendjemand denn wissen, dass Du in einem Fragment unterwegs bist? Dann musst Du den Code nehmen und anpassen, ggf. mal in SO nachschauen: https://stackoverflow.com/a/17763962/19657183.


Also ne for Schleife und muss R.drawable aus der Datenbank entfernen, damit ich nur bild1, bild2, bild3 erhalte
und dann das hinzufügen kann:
getResources().getIdentifier("@drawable/" + imagevonderForSchleife, "drawable", getActivity().getPackageName()); 


mihe7 hat gesagt.:


> Hinzu kommt, dass ich den Code vorher nicht auch noch teste, sondern hier im Editor reinklopfe, d. h. dass da Fehler enthalten sein können, ist ganz normal.


Der erste Parameter ist der Ort, wo das Bild gespeichert ist, das zweite rate ich mal, das es ein drawable Produkt ist, und das dritte kp.
Kann man das Irgendwo nachlesen, was das bedeutet alles?


mihe7 hat gesagt.:


> Eigentlich hätten die Links, die Dir @KonradN gegeben hat, reichen müssen. Ein klein wenig Eigeninitiative darf schon sein


Ich versuche zu recherchieren(seit mehr als 5 Stunden an dieses Problem), soweit wie es geht. Habe durch die Recherche es geschafft mit Hilfe vom´n der List, Die JsonArray in ein String Array umzuwandeln.


----------



## wer112 (26. Nov 2022)

mihe7 hat gesagt.:


> Man lernt, mit Arrays und Methoden umzugehen.


erst nur Grundlagen, die tieferen muss man erlernen. 
Ich weiß, das man den Wert übergeben muss, wenn man nicht dadrauf zugreifen kann.


mihe7 hat gesagt.:


> Das reicht, um ein String-Array in ein int-Array zu konvertieren. Den Code dazu hast Du übrigens von mir schon in #11 bekommen (im ersten fehlt ein `return ids;` nach Zeile 5).


Aber das klappt mit dem Code nicht, wenn ich nur den kopiere und er klappt auch nicht, wenn ich es mit meinen Variablen mache.

Ihre Version:

```
private int[] getDrawableIds(String[] drawableNames) {
        int[] ids = new int[drawableNames.length];
        for (int i = 0; i < drawableNames.length; i++) {
            ids[i] = getDrawableIds(drawableNames[i]);
        }
    
        return ids;
    }
```

Meine Angepasste:


```
private int[] getDrawableIds(String[] image) {
        int[] ids = new int[image.length];
        for (int i = 0; i < image.length; i++) {
            ids[i] = getDrawableIds(image[i]);
        }

        return ids;
    }
```

und ich übergebe den Wert, soweit ich weiß so:


```
getDrawableIds(image);
```

Und wie oben steht, ist String image[] = {}; ja vorhanden und befüllt.

Nach langer recherche befülle ich das aus einem JsonArray in den image String Array:


```
List<String> prod_image_list = new ArrayList<String>();
                        for (int i=0; i<prod_ima.length(); i++) {
                            prod_image_list.add(prod_ima.getString(i) );
                        }
                        image = prod_image_list.toArray(new String[prod_image_list.size()]);
```

Ich konnte den image Array über den Log anzeigen lassen.


----------



## mihe7 (26. Nov 2022)

wer112 hat gesagt.:


> Kann man das Irgendwo nachlesen, was das bedeutet alles?


Das ist genauestens unter b)


KonradN hat gesagt.:


> Aber das dürfte nicht einmal notwendig sein. Wenn Du den Namen und den Typ einer Resource kennst, dann kannst Du auch zur Laufzeit darauf zugreifen:
> a) Context.getResources(): https://developer.android.com/reference/android/content/Context#getResources()
> b) Resources.getIdentifier: https://developer.android.com/refer...g.String, java.lang.String, java.lang.String)


beschrieben.



wer112 hat gesagt.:


> Ihre Version:


Nein. Bei mir steht in Zeile 4 `getDrawableId` und nicht `getDrawableIds`. Dabei ist `getDrawableId` (singular) die in #8 gezeigte Methode, die Du entsprechend an Dein Fragment anpassen musst und die ID für einen (1) String liefert. getDrawableIds liefert dagegen die IDs für mehrere Strings.


----------



## wer112 (27. Nov 2022)

mihe7 hat gesagt.:


> Nein. Bei mir steht in Zeile 4 `getDrawableId` und nicht `getDrawableIds`. Dabei ist `getDrawableId` (singular) die in #8 gezeigte Methode, die Du entsprechend an Dein Fragment anpassen musst und die ID für einen (1) String liefert. getDrawableIds liefert dagegen die IDs für mehrere Strings.


Ich habe ja #11 gedacht, das du das meinst, das du das ja in #38 geschrieben, das du den Code von #11 meinst.
Da hattest du ja extra Fehler eingebaut, wo ich gesagt hatte, das getDrawableId nicht geht, weil da ein s fehlte.

Da ich ja mehrere Drawable Bilder die Id auslesen muss und die ID in den Int[] übertragen muss, fällt ja #8 weg. Da du meinst nur für ein String liefert,

Da habe ich um die ID zu erhalten das sogemacht: Integer i = Integer.parseInt("R.drawable.bild1"); da habe ich die ID erhalten und in die Datenbank zum test eingegeben und konnte dann das im ListView angezeigt bekommen.

Darum Wäre #11 ja dafür da, um ein String Array, mit mehreren Bilder in IDs zu verwandeln, damit ich es dem int[] für den Adapter übergeben kann.


----------



## mihe7 (27. Nov 2022)

wer112 hat gesagt.:


> Da ich ja mehrere Drawable Bilder die Id auslesen muss und die ID in den Int[] übertragen muss, fällt ja #8 weg. Da du meinst nur für ein String liefert,


Nein, das fällt nicht weg, das wird im Code von #11 verwendet:


```
private int getDrawableId(String drawableName) {
    return getResources().getIdentifier(
        drawableName,
        "drawable",
        getActivity().getPackageName()
   );
}

private int[] getDrawableIds(String[] drawableNames) {
    int[] ids = new int[drawableNames.length];
    for (int i = 0; i < drawableNames.length; i++) {
        ids[i] = getDrawableId(drawableNames[i]); // hier wird die Methode oben aufgerufen -> für ein Bild
    }
    return ids;
}
```


----------



## wer112 (27. Nov 2022)

mihe7 hat gesagt.:


> Nein, das fällt nicht weg, das wird im Code von #11 verwendet:
> 
> 
> ```
> ...


Erlich gesagt, sieht es für mich sehr schwer aus. Ich verstehe grade nicht, wie das so ganz funktioniert.
Die untere verstehe ich eigentlich. Sie zerlegt den String und schickt den einzelnen String nach Oben in die Methode. Danach bleibe ich erstmal hängen, denke es geht wieder runter und Ich hole den Int[] durch return raus. 

Wird die Schleife nicht unterbrochen, wenn eine andere Methode aufgerufen wird?

Also schicke ich mein StringArray per getDrawableIds(image); runter in die Methode.

Muss ich dann den Namen : drawableNames zu image ändern oder nimmt drawableNames den Wert einfach auf?






						Rückgabewert von Methoden in Java - LernJAVA.de
					

Was ist ein Rückgabewert (engl. return) einer Methode in Java und wofür wird dieser verwendet? Ein Rückgabewert ist das Ergebnis, das eine Methode an deren Aufrufer zurückgibt.




					lernjava.de
				



 zu beurteilen muss ich nixs ändern, das nimmt getDrawableIds automatisch an...
Wärend ich das schreibe, verstehe ich es langsam.

Kann man zum Beispiel: images = getDrawableIds(image); machen? Da Return ids; ja den Array zurückgibt?

Ich will ja nixs einfach was kopieren, ohne was richtig zu verstanden zu haben. Deswegen kannst mich sehr gerne *korrigieren*, wenn ich falsch liege.

Ps.: die obere verstehe ich immer noch net, nur zu 2%


----------



## mihe7 (27. Nov 2022)

Wie war das mit den Grundlagen? 



wer112 hat gesagt.:


> Wird die Schleife nicht unterbrochen, wenn eine andere Methode aufgerufen wird?


Nein. Die Methode wird ausgeführt und dann wird an der Stelle in der Schleife weitergemacht, die nach dem Methodenaufruf kommt.



wer112 hat gesagt.:


> Muss ich dann den Namen : drawableNames zu image ändern oder nimmt drawableNames den Wert einfach auf?


Nein, drawableNames ist der Bezeichner des Parameters der Methode. Dein image ist einfach ein Argument. Du musst eine Variable `x` bei `System.out.println(x)` auch nicht zu "s" umbenennen, bloß weil der Bezeichner des Parameters von `PrintStream#println(String s)` so heißt. Ganz davon abgesehen, dass das Argument keine Variable sein muss, weil Du das Objekt auch direkt angeben kannst (z. B. ein String-Literal oder ein mit new erstelltes Array).



wer112 hat gesagt.:


> Kann man zum Beispiel: images = getDrawableIds(image); machen? Da Return ids; ja den Array zurückgibt?


Wenn image ein String-Array und images ein int-Array ist, dann ja.



wer112 hat gesagt.:


> Ps.: die obere verstehe ich immer noch net, nur zu 2%


_Was _verstehst Du daran nicht?


----------



## wer112 (27. Nov 2022)

mihe7 hat gesagt.:


> _Was _verstehst Du daran nicht?


Ich verstehe den Oberen Code überhaubt nicht. was das alles bedeutet. Das mit "drawable" und mit dem PackageName... 
Wenn ich normalerweiße Ressorcen hole gebe ich das nie an. Es wäre schön, wenn ich das auch nachvollziehen kann. Könnte mal heute später mal nachschauen, was das genau bedeutet.

Erst mal bedanke ich mich Herzlich bei dir. Das hat jetzt alles super funktioniert. Musste nur in der db R.drawable rauslöschen, dann ging es. Ich habe auf dem Linkmich schlau gemacht. Bisher habe ich noch nie ein return benutz um was zu erhalten. Benutzte nur privat void ... Methoden.


----------



## mihe7 (27. Nov 2022)

Naja, Android benötigt drei Informationen, um eine Ressource zu "lokalisieren":

a) Packagename, der im Manifest angegeben ist. Der dient hier als Namensraum für Ressourcen. Stell Dir vor, Du hast eine Bibliothek eingebunden, die eine Ressource "drawable/bild1" enthält und Du legst in Deiner Anwendung eine Ressource mit dem gleichen Namen an. Der Packagename ist erfoderlich, um zwischen Deinen Ressourcen und den Ressourcen der Bibliothek unterscheiden zu können: meineApp:drawable/bild1 ist eben etwas anderes als eineLib:drawable/bild1.
b) Typ der Ressource wie z. B. drawable
c) Name des Ressourceneintrags wie z. B. bild1

Der vollqualifizierte Name einer Ressource hat nun die Form package:type/entry. Mit diesem kannst Du die Methode `getIdentifier()` aufrufen:

```
// Aufruf mit vollqualifiziertem Namen "meineApp:drawable/bild1"
    int id = getResources().getIdentifier("meineApp:drawable/bild1", null, null);
```
Damit Du nicht immer den vollqualifizierten Namen angeben musst, kannst Du den Typ und den Packagenamen der Methode mitgeben, z. B.

```
int id = getResources().getIdentifier("drawable/bild1", null, getActivity().getPackageName());
    // oder
    int id = getResources().getIdentifier("bild1", "drawable", getActivity().getPackageName());
```


----------



## wer112 (27. Nov 2022)

mihe7 hat gesagt.:


> Naja, Android benötigt drei Informationen, um eine Ressource zu "lokalisieren":
> 
> a) Packagename, der im Manifest angegeben ist. Der dient hier als Namensraum für Ressourcen. Stell Dir vor, Du hast eine Bibliothek eingebunden, die eine Ressource "drawable/bild1" enthält und Du legst in Deiner Anwendung eine Ressource mit dem gleichen Namen an. Der Packagename ist erfoderlich, um zwischen Deinen Ressourcen und den Ressourcen der Bibliothek unterscheiden zu können: meineApp:drawable/bild1 ist eben etwas anderes als eineLib:drawable/bild1.
> b) Typ der Ressource wie z. B. drawable
> ...


Vielen Vielen Dank, für die Erklärung. Das macht jetzt mehr Sinn. Habe bisher noch nie einen eigenen Drawable Ordner bei einer Biblothek gesehen. 
Hatte bisher entweder R.drawable genommen oder getResource(R.drawable.bild1); 

Nach deinem Anschaulichen Code, währe eine Kompination möglich, aber dann müssen die letzten Parameter immer null sein. Und man kann Vertauschen.

Also wenn man zum Beispiel im normalen String xml Ordner zugreifen möchte, währe es:

```
int id = getResources().getIdentifier("stringAlpha", "string", getActivity().getPackageName());
```

oder muss man noch den Vorordner machen. glaube eher mit Vorordner:


```
int id = getResources().getIdentifier("stringAlpha", "values/strings", getActivity().getPackageName());
```


----------



## Jw456 (27. Nov 2022)

String Ressourcen ist wider was anderes .

Schaue dir doch mal den res Ordner in deinen Projekt an . Da hast du einmal einen drawable Ordner und unter values deine Sting.xml







						String Resources | Android Developers
					






					android.cn-mirrors.com


----------



## Jw456 (27. Nov 2022)

"getIdentifier" welchen Datentyp gibt dir das zurück? Schaue es in der Doku nach.
Und was Willst du haben? einen String. Passt nicht zusammen.



			https://developer.android.com/reference/android/content/res/Resources#getIdentifier(java.lang.String,%20java.lang.String,%20java.lang.String)


----------



## KonradN (27. Nov 2022)

Jw456 hat gesagt.:


> Und was Willst du haben? einen String. Passt nicht zusammen.


Es ging doch immer darum, dass er aus den Strings, die die Ressourcen definieren, die Ids haben will. Also doch genau das, was er will.

Und das klappt natürlich für alle Ressourcen - auch für die String Ressourcen. Die einzelnen Strings haben halt auch alle eine id.

Und über die id kann man sich die jeweilige Ressource geben lassen. Wie man an Resources kommt, habe ich schon gezeigt. Und da gibt es dann z.B. getString(int).

Und die Idee ist halt, dass dynamisch irgend welche Ressourcen verwendet werden können sollen und er möchte da von außen die gleichen Namen verwenden, wie diese halt in der App verwendet werden. Und das klappt 1:1 mit allen Ressourcen - auch mit den Strings.


----------



## mihe7 (27. Nov 2022)

wer112 hat gesagt.:


> Nach deinem Anschaulichen Code, währe eine Kompination möglich, aber dann müssen die letzten Parameter immer null sein.


Nein, das sind nur Fallbacks. Du kannst den vollqualifizierten Namen immer angeben.



wer112 hat gesagt.:


> oder muss man noch den Vorordner machen. glaube eher mit Vorordner:


Der Typ müsste einfach nur "string" sein. So, wie Du es auch sonst referenzierst: R.string.stringAlpha -> Typ = "string", Name = "stringAlpha" und das im Application Package.


----------



## wer112 (27. Nov 2022)

Jw456 hat gesagt.:


> "getIdentifier" welchen Datentyp gibt dir das zurück? Schaue es in der Doku nach.
> Und was Willst du haben? einen String. Passt nicht zusammen.
> 
> 
> ...


Wollte nur Nachfragen, wenn ich die ID benötige für einen Wert und ich in einen Ordner Zugreifen muss, muss ich ja denjeweiligen Unterordner nehmen z.B.: values/string um einen String daraus zu erhalten. 
oder geht es mit getIdentifer nicht?


----------



## Jw456 (27. Nov 2022)

```
int id = getResources().getIdentifier("string/app_name",  null,  getActivity().getPackageName());
        int id2 = getResources().getIdentifier("string", "app_name",  getActivity.getPackageName());

        String string = getString(R.string.app_name);
        String string2 = getString(id);
        String string3 = getString(id2);
```

Alle drei Strings liefern den gleichen App Namen.


----------



## Jw456 (27. Nov 2022)

```
int id2 = getResources().getIdentifier("string", "app_name",  getActivity().getPackageName());
```
Sorry Tipp Fehler


----------

