2013-03-18 11 views
40

Ho provato questo:Utilizzando Android getIdentifier()

r = Resources.getSystem().getIdentifier("ball_red","drawable","com.Juggle2"); 
Log.i("FindBall","R = "+r); 

E questo:

r = Resources.getSystem().getIdentifier("com.Juggle2:drawable/ball_red", null, null); 

Ma 'r' finisce sempre come zero.

Sto chiamando questa linea da una classe helper che non è un'attività e non estende nulla, quindi non posso semplicemente chiamare getResources(), ma posso passarlo dal mio SurfaceView.

Eventualmente, desidero sostituire "ball_red" con una variabile, ma la prima cosa è la prima. Questo non funziona

com.Juggle2 è davvero il mio nome del pacchetto. drawable è la cartella res in cui si trova e, il nome del file è effettivamente ball_red.

R.java dice:

 public static final int ball_red=0x7f020027; 

, quindi non sono sicuro perché non sta funzionando.


quindi non posso usare le risorse, devo passare un contesto, e sto facendo che in questo modo: All'interno qui:

class Collection extends SurfaceView implements SurfaceHolder.Callback { 

Sto facendo una nuova istanza della mia classe e passandolo a getContext() come parametro.

+2

Come da documentazione di 'Resources.getSystem()': * "Restituisce un oggetto Risorse condivise globali che ** fornisce accesso solo alle risorse di sistema (nessuna risorsa applicazione) ** e non è configurato per la schermata corrente (può non utilizzare le unità di misura, non cambia in base all'orientamento, ecc.). * * Come risposta da @Sajmon, è necessario passare un'istanza di 'Context' al metodo di supporto (statico) per accedere alle risorse specifiche dell'applicazione. –

+0

btw l'aspetto del tipo è case sensitive, ad es. "stringhe", "estraibile" e non "Stringhe" o "Disegnabile" –

risposta

106

Dal momento che si è all'interno di un'attività è sufficiente scrivere

int resId=YourActivity.this.getResources().getIdentifier("ball_red", "drawable", YourActivity.this.getPackageName()); 

o se non stai chiamando da una classe interna

int resourceID = getResources().getIdentifier("ball_red", "drawable", getPackageName()); 

Nota

getIdentifier() Returns 0 if no such resource was found. (0 is not a valid resource ID.) 

Verificare

Controllare anche nella vostra R.java se v'è un drawable con il nome ball_red

esempio:

public static final class drawable { 
     public static final int ball_red=0x7f020000; 
} 

EDIT Se non siete in qualsiasi attività allora si deve passare un context instead of resources as parameter quindi fare questo

+0

Non lo chiamo da un'attività, e non ho accesso a 'getResources()', ma posso passare Risorse da un La classe 'SurfaceView', quindi proverò quella – Houseman

+0

Sì, il' drawable 'è lì. – Houseman

+0

@OWiz Se non ci si trova in alcuna attività, è necessario passare un contesto anziché risorse come parametro, quindi eseguire int resId = context.getResources(). GetIdentifier ("ball_red", "drawable", context.getPackageName ()); –

2

Sebbene la risposta di Festus Tamakloe sia corretta, ho trovato un capriccio in questa funzione.

Se si dichiara una string-array in un file XML deve essere letta chiamando il tipo di risorsa di base array, utilizzando string-array risultati in anid 0 ritorno.

+0

Mi hai appena salvato ore, grazie! –

5

Per gli utenti Xamarin ho riscontrato il problema in cui avevo aggiunto un'icona con lettere maiuscole e minuscole (ad esempio iconVaccine.png) e si riferiva al nome utente nome iconaVaccine.

Xamarin vi permetterà di fare questo (anche se non si dovrebbe), ma quando l'applicazione viene compilato il nome sono appiattite in lettere minuscole, quindi è necessario fare riferimento al caso variante inferiore come segue:

Nome immagine: iconVaccine.png

Xamarin di riferimento: iconVaccine (come creato nel Resource.designer.cs, ma fallirà)

riferimento corretto: iconvaccine

Speranza che aiuta!

Problemi correlati