String Array Pfad in Int setzen

wer112

Top Contributor
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

Top Contributor
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

Top Contributor
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

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

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.

String testString[] = {"R.drawable.bild1", "R.drawable.bild2", "R.drawable.bild3"};
Hier stehen nun Wörter, die keinerlei Bedeutung für die Anwendung haben.

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:
Java:
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

Top Contributor
Damit ich für R.drawable.bild eine Tahlenvolge erhalte und diese dann irgendwie an den Int übergeben lassenkann
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.
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;
Java:
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.
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

Super-Moderator
Mitarbeiter
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

Top Contributor
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?
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?
Werde es mal anschauen.
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

Top Contributor
Jetzt hat Dir @KonradN doch schon einen Link auf die Lösung (SO) gepostet, das kann man noch in eine Methode klatschen:
Java:
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

Top Contributor
Jetzt hat Dir @KonradN doch schon einen Link auf die Lösung (SO) gepostet, das kann man noch in eine Methode klatschen:
Java:
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.
Geht es auch mit nem String Array?
 

mihe7

Top Contributor
Geht es auch mit nem String Array?
Java:
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:
Java:
private int[] getDrawableIds(String[] drawableNames) {
    return Arrays.stream(drawableNames).mapToInt(this::getDrawableId).toArray();
}
 

Jw456

Top Contributor
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

Top Contributor
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

Top Contributor
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.
 

Jw456

Top Contributor
Java:
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
        }
 
Zuletzt bearbeitet:

wer112

Top Contributor
Java:
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
        }
zeigt mir fast alles rot an
 

Jw456

Top Contributor
Java:
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

Top Contributor
Java:
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()
   );
}
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

Top Contributor
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

Top Contributor
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

Top Contributor
Jetzt hat Dir @KonradN doch schon einen Link auf die Lösung (SO) gepostet, das kann man noch in eine Methode klatschen:
Java:
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.
ist auch nicht richtig sinnvoll in einem Fragment.

besser so
Java:
private int getDrawableId(String drawableName) {
        int drawable = getActivity().getResources().getIdentifier(
                drawableName,
                "drawable",

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

wer112

Top Contributor
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
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

Top Contributor
Poste Code im Code Block
Also kein eigene Methode?

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

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

httpdigest

Top Contributor
Wow, das tut ja fast schon weh... :D
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

Top Contributor
Wow, das tut ja fast schon weh... :D
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

Top Contributor
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.
 

wer112

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

Java:
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:

Code:
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()]);

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

Top Contributor
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

Top Contributor
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

Top Contributor
Meine frage hast du nicht beantwortet.
Ich habe nach "images" gefragt "s".
Sorry eine Zeile so wenig kopiert:

Java:
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);

    }
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"
 

wer112

Top Contributor
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());
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?
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

Top Contributor
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.
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:
Java:
    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:

Code:
 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:

Java:
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:

Java:
                          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

Top Contributor
Kann man das Irgendwo nachlesen, was das bedeutet alles?
Das ist genauestens unter b)
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.

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

Top Contributor
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

Top Contributor
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:

Java:
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

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

Java:
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;
}
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?

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

Top Contributor
Wie war das mit den Grundlagen?

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.

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).

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.

Ps.: die obere verstehe ich immer noch net, nur zu 2%
Was verstehst Du daran nicht?
 

wer112

Top Contributor
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

Top Contributor
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:
Java:
    // 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.
Java:
    int id = getResources().getIdentifier("drawable/bild1", null, getActivity().getPackageName());
    // oder
    int id = getResources().getIdentifier("bild1", "drawable", getActivity().getPackageName());
 

wer112

Top Contributor
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:
Java:
    // 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.
Java:
    int id = getResources().getIdentifier("drawable/bild1", null, getActivity().getPackageName());
    // oder
    int id = getResources().getIdentifier("bild1", "drawable", getActivity().getPackageName());
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:
Java:
int id = getResources().getIdentifier("stringAlpha", "string", getActivity().getPackageName());

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

Java:
int id = getResources().getIdentifier("stringAlpha", "values/strings", getActivity().getPackageName());
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Mit Java neues item in ein string-array einer Strings.xml schreiben Android & Cross-Platform Mobile Apps 4
W UTF-8 String Android & Cross-Platform Mobile Apps 66
W Base64 konvertierter URI String Android & Cross-Platform Mobile Apps 32
W Volley String Response gibt falchen if aus Android & Cross-Platform Mobile Apps 35
H Anfänger String types not allowed (at 'textColor' with value 'black' Android & Cross-Platform Mobile Apps 13
W Firestore String in Apps Laden Android & Cross-Platform Mobile Apps 10
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
C Zugriff auf die Position eines String- bzw Spinner-Arrays Android & Cross-Platform Mobile Apps 1
J Android String in andere Java-Dateien überführen Android & Cross-Platform Mobile Apps 1
J R.string.(variable) geht das Android & Cross-Platform Mobile Apps 3
R Android incomingNumber bein Eingehenden Anruf immer leerer String Android & Cross-Platform Mobile Apps 4
S SPLIT funktion bei STRING funktioniert nicht! Android & Cross-Platform Mobile Apps 4
G String an einen php Script senden Android & Cross-Platform Mobile Apps 8
J Plötzlich "java.lang.String cannot be converted to JSONObject" Android & Cross-Platform Mobile Apps 9
T int to string ... Android & Cross-Platform Mobile Apps 8
A String[] für Lisadapter Android & Cross-Platform Mobile Apps 4
M jsonobject cannot be cast to java.lang.string Android & Cross-Platform Mobile Apps 4
N Android Hilfe string to float geht nicht... Android & Cross-Platform Mobile Apps 4
J Einen String bewegen wie? Android & Cross-Platform Mobile Apps 3
R String wie WAV Datei nutzen Android & Cross-Platform Mobile Apps 4
C 2 kleine Probleme (Datei lesen, String durchsuchen) Android & Cross-Platform Mobile Apps 16
L String dem Display anpassen Android & Cross-Platform Mobile Apps 12
G Text parsen String to Double Android & Cross-Platform Mobile Apps 2
S ein String nach vorgegebenen Zeichen teilen Android & Cross-Platform Mobile Apps 3
N Zeichen im String löschen? Android & Cross-Platform Mobile Apps 18
M MIDlet + Datum in String Android & Cross-Platform Mobile Apps 5
O Android Spinner-Array ändern Android & Cross-Platform Mobile Apps 6
J Button array ID Problem Android & Cross-Platform Mobile Apps 2
A Android veränderbares Array abspeichern und auslesen Android & Cross-Platform Mobile Apps 7
B Bitmap Array im Spinner übergeben? Android & Cross-Platform Mobile Apps 28
A Android Button Array? Android & Cross-Platform Mobile Apps 6
M Array oder Vector Android & Cross-Platform Mobile Apps 4
O Array Android & Cross-Platform Mobile Apps 2
M FileNotFoundException obwohl der Pfad und der Filename korrekt sind Android & Cross-Platform Mobile Apps 6
J Android Pfad von Bildern ermitteln Android & Cross-Platform Mobile Apps 2
R Android Objekt in bestimmten Pfad auf Android-gerät speichern Android & Cross-Platform Mobile Apps 8

Ähnliche Java Themen

Neue Themen


Oben