Domanda

L'Android SDK di documentazione, tutti gli esempi utilizzati con la @drawable/my_image sintassi xml direttamente l'indirizzo di immagini che vengono memorizzati in res/drawable directory nel mio progetto.

Mi chiedo se esplicitamente non va bene per creare una sottodirectory all'interno di drawable directory.

Per esempio, se ho avuto la seguente struttura di directory:

res/drawable
-- sandwiches
  -- tunaOnRye.png
  -- hamAndSwiss.png
-- drinks
  -- coldOne.png
  -- hotTea.png

Potrei fare riferimento all'immagine di un insalata di tonno panino come @drawable/panini/tunaOnRye

O devo mantenere la gerarchia piatta in drawable directory.

È stato utile?

Soluzione

No, il meccanismo delle risorse non supporta sottocartelle nella cartella drawable directory, quindi sì, è necessario mantenere la gerarchia piatta.

Il layout della directory che hai mostrato comporterebbe nessuna delle immagini disponibili.

Dai miei esperimenti, sembra che avere una sottocartella con tutti gli elementi in esso, entro il res/drawable cartella, farà sì che il compilatore di risorse per fallire -- prevenire il R.java file viene generato correttamente.

Altri suggerimenti

La soluzione che sto usando (e quello di Android in sé sembra favorire) è di sostituire essenzialmente una sottolineatura per uno slash, quindi la struttura sarebbe simile a questa:

sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png

L'approccio richiede di essere meticoloso nella vostra denominazione e non la rende molto più facile da disputare i file stessi (se avete deciso che le bevande e panini in realtà dovrebbe essere tutti "food", che avrebbe dovuto fare una massa rinominare piuttosto che semplicemente spostandoli nella directory); ma la complessità del vostro logica di programmazione non soffre anche male rispetto alla struttura di cartelle equivalente.

Questa situazione fa schifo davvero. Android è un miscuglio di decisioni di progettazione meravigliosi e terribili. Possiamo solo sperare per l'ultima parte per ottenere estirpate con tutto il dovuto fretta:)

Sì -. Lo fa succhiare :) Tuttavia è possibile utilizzare la cartella di beni e hanno indici secondari in là e caricare le immagini in questo modo

In realtà, su Android Studio è possibile. Si possono avere nidificato risorse come mostrato qui :

 entrare descrizione dell'immagine qui

C'è anche un plugin per raggruppare le risorse qui .

cartella di utilizzare i beni.

codice di esempio:

InputStream is = null;
try {
    is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
    ;
}

image = BitmapFactory.decodeStream(is);

Ho scritto un plugin di Eclipse che permette di creare sottocartella virtuale separando il nome di file con due sottolineature __. Il progetto è in fase iniziale, ma non preoccupatevi che non vada in crash il vostro IDE

maggiori dettagli possono essere trovati qui, si sentono liberi di forcella e inviare richieste di pull:

https://github.com/kirill578/Android-Sorted-Res-Folder

entrare descrizione dell'immagine qui

Mi piace usare un semplice script per appiattire una struttura di directory organizzata fornite dai progettisti per qualcosa che può essere utilizzato per generare un file R.

Esegui con il percorso di corrente in drawable-hdpi:

#! /bin/bash
DIRS=`find * -type d`
for dir in ${DIRS} ; do 
  for file in `ls ${dir}` ; do
    mv ${dir}/${file}  ${dir}_${file};
  done 
  rmdir ${dir};
done

In studio androide con Gradle è possibile avere più direttori di origine che permetteranno di separare le risorse. Ad esempio:

android {
    ....
    android.sourceSets {
        main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
    }
    ....
}

Tuttavia, i nomi non devono collidere che significa che sarà ancora bisogno di avere nomi come sandwiches_tunaOnRye ma si sarà in grado di avere una sezione separata per tutti i vostri panini.

Questo consente di memorizzare le risorse in strutture diverse (utile per auto generato contenuti quali actionbargenerator)

Un modo per ottenere parzialmente aggirare il problema è quello di utilizzare il suffisso API di livello. Io uso res / layout v1, res / layout v2 ecc per contenere più progetti secondari nello stesso apk. Questo meccanismo può essere utilizzato per tutti i tipi di risorse.

Ovviamente, questo può essere utilizzato solo se si prendono di mira i livelli di API di sopra della res / layout v? che si sta utilizzando.

Inoltre, guardare fuori per il bug in Android 1.5 e 1.6. consultare la documentazione sulle API Andoroid livello suffisso .

Con l'avvento del sistema bibliotecario, creando una libreria per ogni grande insieme di attività potrebbe essere una soluzione.

E 'ancora problematico, in quanto si deve evitare di usare gli stessi nomi all'interno di tutti i beni, ma usando uno schema prefix per biblioteca dovrebbe aiutare in questo.

Non è così semplice come in grado di creare le cartelle, ma che aiuta a mantenere le cose sano di mente ...

C'è una soluzione per questa situazione: è possibile creare un resVector (ad esempio) la cartella sullo stesso livello come cartella predefinita res. C'è possibile aggiungere tutte le cartelle drawable-xxx risorse ci:

resVector
-drawable
-layout
-color

Dopo che tutto ciò che serve è aggiungere

sourceSets {
        main.res.srcDirs += 'src/main/resVector'
    }

nel vostro file di build.gradle (all'interno android { }).

Non si tratta di metodi perfetti. È necessario implementare stesso modo che è indicazione qui .

È anche possibile chiamare l'immagine nella cartella attraverso il codice è possibile utilizzare

Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);

TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);

Non la mia, ma ho trovato questa discussione quando alla ricerca di questo problema, se la vostra utilizzando Android Studio e Gradle Build System sua piuttosto facile nessun plugin necessario solo un po 'di editing build file

https://stackoverflow.com/a/22426467/618419

Gradle con Android Studio potrebbe farlo in questo modo ( link ).

E 'nel paragrafo "Configurazione della struttura"

sourceSets {
 main {
    java {
        srcDir 'src/java'
    }
    resources {
        srcDir 'src/resources'
    }
 }
}

creare una cartella nella principale.  come: 'res_notification_btn'

e creare la cartella albero in. Come 'disegnabile' o 'Layout'

poi nel 'build.gradle' aggiungere questo

sourceSets
            {
                main
                {
                    res
                    {
                        srcDirs = ['src/main/res_notification_btn', 'src/main/res']
                      or
                        srcDir 'src/main/res_notification_btn'
                    }
                }
            }
#!/usr/bin/env ruby

# current dir should be drawable-hdpi/ etc

# nuke all symlinks
Dir.foreach('.') {|f|
    File.delete(f) if File.symlink?(f)
}

# symlink all resources renaming with underscores
Dir.glob("**/*.png") {|f|
    system "ln -s #{f} #{f.gsub('/', '_')}" if f.include?("/")
}

Bash Appiattisci cartella di script che converte gerarchia di cartelle in una singola cartella

attività /     Si può usare per archiviare file di risorse prime. I file che si salva qui vengono compilate in un file .apk così com'è, e il nome del file originale viene mantenuta. È possibile navigare questa directory nello stesso modo come un file system tipico utilizzando URI e leggere i file come un flusso di byte utilizzando l'AssetManager. Ad esempio, questo è una buona posizione per le strutture e dati di gioco. http://developer.android.com/tools/projects/index.html

Le sottodirectory non sono ammessi, la risorsa deve contenere solo [a-z0-9 _.].

Non si dispone di lettere maiuscole, e non le barre.

  1. Fare clic destro sulla Drawable
  2. Selezionare Nuovo ---> Directory
  3. Inserisci il nome della directory. Ad esempio: logo.png (la posizione sarà già mostrare la cartella disegnabile per impostazione predefinita)
  4. Copia e incolla le immagini direttamente nella cartella drawable. Mentre incollare si ottiene la possibilità di scegliere MDPI / xhdpi / xxhdpi ecc per ciascuna delle immagini da un elenco. Selezionare l'opzione appropriata e immettere il nome dell'immagine. Assicurarsi di mantenere lo stesso nome come il nome della directory cioè logo.png
  5. Fare lo stesso per le immagini rimanenti. Tutti loro saranno collocate sotto la cartella principale logo.png.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top