No momento, estou armazenando todos os arquivos de layout xml dentro da res/layout
pasta, para que seja viável e simples gerenciar pequenos projetos, mas quando houver um caso de projetos grandes e pesados, deve haver uma hierarquia e subpastas necessárias dentro a pasta de layout.
por exemplo
layout
-- layout_personal
-- personal_detail.xml
-- personal_other.xml
--layout_address
-- address1.xml
-- address2.xml
Da mesma forma, gostaríamos de ter subpastas para aplicativos grandes, então existe alguma maneira de fazê-lo dentro do projeto android?
Sou capaz de criar subpastas layout-personal e layout_address dentro da pasta layout, mas quando chega a hora de acessar o arquivo de layout xml usando R.layout ._______, naquele momento não há nenhum pop-up de layout xml dentro do diretório cardápio.
android
android-layout
Paresh Mayani
fonte
fonte
Respostas:
Você pode fazer isso com gradle. Eu fiz um projeto de demonstração mostrando como.
O truque é usar a capacidade do gradle para mesclar várias pastas de recursos e definir a pasta res, bem como as subpastas aninhadas no bloco sourceSets.
A peculiaridade é que você não pode declarar uma pasta de recursos de contêiner antes de declarar as pastas de recursos filho dessa pasta.
Abaixo está o bloco sourceSets do arquivo build.gradle da demonstração. Observe que as subpastas são declaradas primeiro.
Além disso, o pai direto de seus arquivos de recursos reais (pngs, layouts de xml, etc.) ainda precisa corresponder à especificação .
fonte
R.layout.list_item
é proveniente da pastamovies
ou dacinemas
pasta, portanto, a nomeação simples ainda se aplica.build:gradle:0.14.4
ebuildToolsVersion "21.1.1"
.URI is not registered
problema.A resposta é não.
Gostaria de chamar sua atenção para este livro Pro Android 2, que afirma:
fonte
raw
como recursos, você obtém faixas dependentes da densidade / orientação / versão / etc, enquantoassets
você precisa fazer isso manualmente.Eu só queria acrescentar à fantástica resposta da eskis para pessoas com problemas. (Nota: isso funcionará apenas e parecerá com diretórios separados dentro da visualização 'projeto', não da visualização 'android', infelizmente.)
Testado com o seguinte. BuildToolsVersion = 23.0.0 nível 1.2.3 e 1.3.0
Foi assim que consegui que o meu trabalhasse com um projeto já construído.
Quando isso estiver concluído, entre no arquivo gradle.build dos módulos e crie uma definição sourceSets como esta ... (Verifique se 'src / main / res / layouts' e 'src / main / res' são sempre os dois últimos! !! Como eu estou mostrando abaixo).
Lucro $$$$
Mas falando sério .. foi assim que eu consegui funcionar. Deixe-me saber se alguém tiver alguma dúvida .. Eu posso tentar ajudar.
Imagens valem mais que palavras.
fonte
layout-v21
?'src/main/res/layouts/content'
e o caminho deste configuração é'src/main/res/layouts/content/layout'
Não é possível, mas a pasta de layout está classificada por nome. Portanto, eu prefixo os nomes dos arquivos de layout com os nomes dos meus pacotes. Por exemplo, para os dois pacotes "comprando" e "jogando":
fonte
Eu uso o plug-in de agrupamento de arquivos do Android para o Android Studio.Ele realmente não permite criar subpastas, mas pode exibir seus arquivos e recursos como estão em pastas diferentes. E é exatamente isso que eu queria.
Você pode instalar o plug-in "Android File Grouping"
Janelas:
Mac:
No Mac, pude testá-lo e não consegui pesquisar o plugin. Então eu baixei o plugin aqui e usei a
Install plugin from disk
opção da configuração acima.fonte
Agora, com o Android Studio e o Gradle, você pode ter várias pastas de recursos no seu projeto. Permitindo organizar não apenas seus arquivos de layout, mas qualquer tipo de recurso.
Não é exatamente uma subpasta, mas pode separar partes do seu aplicativo.
A configuração é assim:
Verifique a documentação .
fonte
clean
para vê-lo refletido no aplicativo.Eu acho que a solução mais elegante para esse problema (como as subpastas não são permitidas) é acrescentar os nomes dos arquivos com o nome da pasta em que você os colocaria. Por exemplo, se você tiver um monte de layouts para uma Atividade, Fragmento ou apenas uma visão geral chamada "locais", você deve anexá-lo com places_my_layout_name. Pelo menos isso resolve o problema de organizá-los de uma maneira que eles são mais fáceis de encontrar no IDE. Não é a solução mais impressionante, mas é melhor que nada.
fonte
Pequeno problema
Consigo alcançar subpastas seguindo a resposta principal para esta pergunta.
No entanto, à medida que o projeto cresce, você terá muitas subpastas:
Não é um grande problema, mas:
app/build.gradle
sempre que adicionar uma nova pasta.Melhoria
Então, eu escrevi um método Groovy simples para pegar todas as pastas aninhadas:
Cole esse método fora do
android {...}
bloco no seuapp/build.gradle
.Como usar
Para uma estrutura como esta:
Use-o assim:
Se você tem uma estrutura como esta:
Você o usará assim:
Explicação
getLayoutList()
tomaa relative path
como argumento. Orelative path
é relativo à raiz do projeto. Portanto, quando introduzirmos"app/src/main/res/layouts/"
, ele retornará o nome de todas as subpastas como uma matriz, que será exatamente igual a:Aqui está o script com comentários para entender:
Espero que ajude!
fonte
setContentView(R.layout.Admin.admin_home .)
Admin.admin_home não for resolvidoR.layout.admin_home
. O script deve poder escolher automaticamente os nomes para você. Deixe-me saber se você pode fazê-lo funcionar.array.push("src/main/res");
paradef res="src/main/res";
array.push(res);
, porque eu tenho um erro como impulso quer parâmetro gstring não Cordas um .se qualquer um, em vez de me encontrou este erro, você pode editá-lo// uncomment for debugging
e depois verificar se as saídassrc/main/res/layouts/<your_layout_files>
foram detectadas corretamente?Agora podemos fazer facilmente com o plugin JetBrains chamado " Agrupamento de arquivos Android "
confira este link
Agrupamento de arquivos do Android
fonte
Android Studio
Uma maneira que eu fiz foi criar uma pasta res separada no mesmo nível da pasta res real no seu projeto, então você pode usá-la nos aplicativos build.gradle
cada subpasta da sua nova pasta res pode ser algo relacionado a cada tela específica ou algo no seu aplicativo, e cada pasta terá seus próprios
layout
/drawable
/values
etc, mantendo as coisas organizadas e você não precisará atualizar o arquivo gradle manualmente como alguns desses outros as respostas exigem (basta sincronizar sua nota cada vez que você adicionar uma nova pasta de recursos para que ela saiba sobre ela e adicione as subpastas relevantes antes de adicionar seus arquivos xml).fonte
Verifique o script Bash Flatten Folder que converte a hierarquia de pastas em uma única pasta
fonte
Se você estiver desenvolvendo em uma caixa Linux ou Mac, uma solução alternativa seria criar subpastas que incluam links simbólicos para seus arquivos de layout. Basta usar o comando ln com -s
O problema é que a pasta Layout ainda contém todos os arquivos .xml. Mas você pode selecioná-los usando as subpastas. É a coisa mais próxima do que você gostaria de ter.
Acabei de ler, que isso também pode funcionar com o Windows se você estiver usando o Vista ou posterior. Existe este
mklink
comando. Basta pesquisar no Google, nunca o usei.Outro problema é que, se você tiver o arquivo aberto e tentar abri-lo novamente, o plug-in lança uma exceção de ponteiro NULL. Mas não desliga.
fonte
Embora todas as propostas para vários conjuntos de recursos possam funcionar, o problema é que a lógica atual do plug-in Android Studio Gradle não atualizará os arquivos de recursos depois de terem sido alterados para conjuntos de recursos aninhados. A implementação atual tenta verificar os diretórios de recursos usando o startWith (), para que uma estrutura de diretório aninhada (por exemplo, src / main / res / layout / layouts e src / main / res / layout / layouts_category2) escolha src / main / res / layout / layouts de maneira consistente e nunca atualize as alterações. O resultado final é que você precisa reconstruir / limpar o projeto toda vez.
Enviei um patch em https://android-review.googlesource.com/#/c/157971/ para tentar ajudar a resolver as coisas.
fonte
A resposta principal de @eski é boa, mas o código não é elegante de usar, então escrevi um script groovy gradle para uso geral. É aplicado a todos os tipos de compilação e tipos de produtos e não apenas pode ser usado no layout, mas também é possível adicionar subpasta a qualquer outro tipo de recurso, como drawable. Aqui está o código (coloque-o no
android
bloco de arquivo gradle no nível do projeto):Como fazer na prática?
Por exemplo, eu quero criar subpasta chamada
activity
paralayout
, adicionar uma cadeia por qualquer nome naresDirs
variável comolayouts
, em seguida, o arquivo xml layout deve ser colocado emres\layouts\activity\layout\xxx.xml
.Se eu quiser criar subpasta chamada
selectors
paradrawable
, adicionar uma cadeia por qualquer nome naresDirs
variável comodrawables
, em seguida, o arquivo xml drawable deve ser colocado emres\drawables\selectors\drawable\xxx.xml
.O nome da pasta, como
layouts
edrawables
é definido naresDirs
variável, pode ser qualquer sequência. Todas as subpastas criadas por você, comoactivity
ouselectors
são consideradas iguais àres
pasta. Portanto, naselectors
pasta, precisamos criar umadrawable
pasta adicionalmente e colocar arquivos xml nadrawable
pasta, depois que o gradle possa reconhecer os arquivos xml como desenhados normalmente.fonte
Se você usar o método na resposta aprovada e quiser melhorá-lo um pouco, altere a configuração de gradle da seguinte maneira:
Portanto, se você adicionar mais pastas e layouts, não precisará voltar aqui e anexar uma longa lista de pastas de origem, deixe a gradle obter todas as pastas para você.
fonte
fonte
Project
modo. Não consegui entender onde as subpastas desapareceram (noAndroid
modo).Bem, a resposta curta é não. Mas você definitivamente pode ter várias
res
pastas. Acho que é o mais próximo possível de ter subpastas para alayout
pasta. Aqui está como você faz isso.fonte
As principais respostas têm várias desvantagens: você precisa adicionar novos caminhos de layout, o AS coloca novos recursos na
res\layouts
pasta em vez deres\values
.Combinando várias respostas que escrevi de maneira semelhante:
Criei pastas com este artigo: http://alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/ . Para criar subpastas, você deve usar este menu: Novo> Pasta> Pasta Res.
ATUALIZAR
Depois de algumas semanas, descobri que as alterações nos recursos não são percebidas pelo Android Studio . Então, alguns erros estranhos aparecem. Por exemplo, layouts continuam mostrando tamanhos antigos, margens. Às vezes, o AS não encontra novos arquivos XML (especialmente durante o tempo de execução). Às vezes, ele mistura
view id
s (referências a outro arquivo XML). Geralmente, é necessário pressionarBuild > Clean Project
ouBuild > Rebuild Project
. Leia Reconstrução necessária depois de alterar os arquivos de layout xml no Android Studio .fonte
res
pasta tradicional , porque o AS não suporta totalmente a divisão de recursos em pastas. Provavelmente vou mudar essa resposta ou até excluir. Mas o que você quer dizer quando diz que não é uma maneira aceitável de fornecer soluções aqui no SO?Não pode ter subdiretórios (facilmente), mas você pode ter pastas de recursos adicionais . Surpreendido, ninguém já o mencionou, mas para manter as pastas de recursos padrão e adicionar um pouco mais:
fonte