Come ottenere un valore da una matrice di risorse per nome in Android?

Supponiamo di avere una risorsa xml file come questo:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <array name="difficulties">
        <item>
            <integer name="level">1</integer>
            <integer name="fixed_blocks">2</integer>
            <integer name="color_count">2</integer>
        </item>
        <item>
            <integer name="level">2</integer>
            <integer name="fixed_blocks">4</integer>
            <integer name="color_count">3</integer>
        </item>
        <item>
            <integer name="level">3</integer>
            <integer name="fixed_blocks">6</integer>
            <integer name="color_count">3</integer>
        </item>
    </array>    
</resources>

Come posso ottenere i valori interi da un item per nome? Il TypedValue‘s API non sembra contenere alcun metodo per questo. Se questo non è possibile con il TypedArray come È?

Se posso ottenere un valore da un elemento dal suo ordinale sarà troppo OK.

InformationsquelleAutor Adam Arold | 2012-10-01

 

One Reply
  1. 5

    Non ricordo questo sia possibile(ma potrei sbagliarmi). A giudicare dalla struttura di un elemento(in difficulties array) si potrebbe fare qualcosa di diverso, si potrebbe utilizzare un array di interi array. Sapendo che l’elemento di matrice è level alla prima posizione, fixed_blocks come la seconda posizione, ecc si può facilmente ottenere i valori. Un esempio di questo si può trovare qui Android Risorsa – Array di Array

    Edit:
    È questo il metodo che stai cercando?

    private int[] getLevelConstants(int level) {
        int[] result = null;
        TypedArray ta = getResources().obtainTypedArray(R.array.difficulties);
        //keep in mind the differences between the level(starts at 1) and the index of the difficulties array which starts at 0
        int id = ta.getResourceId(level, 0); 
        if (id > 0) {
            result = getResources().getIntArray(id);
        } else {
            //something bad
        }
        return result;
    }

    l’array:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <integer-array name="difficulties">
            <item>@array/level1</item>
            <item>@array/level2</item>
        </integer-array>
    
        <integer-array name="level1" >
            <item>1</item>
            <item>2</item>
            <item>2</item>
        </integer-array>
    
        <integer-array name="level2" >
            <item>2</item>
            <item>4</item>
            <item>3</item>
        </integer-array>
    
    </resources>
    • Il problema con questo è che ricevo un indice da un’altra attività, che punti ad una specifica difficoltà (in modo da ottenere 2 per esempio) e ho bisogno di ottenere l’elemento da TypedArray da indice e dopo di che controllare i suoi elementi.
    • Difficoltà 2 si intende level 2 nell’elemento dell’array, giusto? Se questo è il caso, allora il level intero ha una semplice mappatura con l’indice della difficulties array, basta sottrarre 1(il difficulties array inizia indice 0 e il livello inizia da 1), l’indice e il gioco è fatto.
    • No il problema è che non posso usare R. array.le difficoltà.livello1, per esempio, dal momento che non posso inserire nel mio programma, ho solo un indice. Non posso usare R. array.difficoltà dal momento che io non riesco a estrarre il mio iteger-array con un metodo, posso solo estratto string-array. Così non ho l’id di Risorsa di cui ho bisogno per cercare di Risorse ho solo un ordinale per un elemento interno di una risorsa.
    • Scusa non ero a conoscenza di getResourceId()

Lascia un commento