Estou adicionando TextViews programaticamente em um loop for e os adiciono a um ArrayList.
Como eu uso TextView.setId(int id)
? Qual ID inteiro eu proponho para que não entre em conflito com outros IDs?
Estou adicionando TextViews programaticamente em um loop for e os adiciono a um ArrayList.
Como eu uso TextView.setId(int id)
? Qual ID inteiro eu proponho para que não entre em conflito com outros IDs?
De acordo com a View
documentação
O identificador não precisa ser exclusivo na hierarquia dessa exibição. O identificador deve ser um número positivo.
Portanto, você pode usar qualquer número inteiro positivo que desejar, mas nesse caso, pode haver algumas visualizações com IDs equivalentes. Se você deseja procurar alguma exibição na hierarquia, chamar setTag
com alguns objetos-chave pode ser útil.
findViewById
faz qualquer garantia quanto a qual exibição é retornada se houver mais de uma com o mesmo ID? Os documentos não mencionam nada.findViewById
retornará a primeira que encontrar.setContentView()
tiver, digamos, 10 visualizações com o ID definido para o mesmo número de ID na mesma hierarquia , uma chamada parafindViewById([repeated_id])
retornará a primeira exibição definida com esse ID repetido. Foi isso que eu quis dizer.A partir do nível 17 da API, você pode chamar: View.generateViewId ()
Em seguida, use View.setId (int) .
Se seu aplicativo estiver direcionado abaixo do nível da API 17, use ViewCompat.generateViewId ()
fonte
AtomicInteger
implementação de métodos.for(;;)
que eu nunca vi isso antes. Como se chama isso?Você pode definir os IDs que serão usados posteriormente na
R.id
aula usando um arquivo de recurso xml e permitir que o Android SDK forneça valores exclusivos durante o tempo de compilação.Para usá-lo no código:
fonte
"int currentId = 1000; whateverView.setId(currentId++);
- Isso incrementa o ID toda vez quecurrentId++
é usado, garantindo um ID exclusivo, e posso armazenar o IDs em meu ArrayList para acesso posterior.<resources>
.Também você pode definir
ids.xml
emres/values
. Você pode ver um exemplo exato no código de exemplo do Android.fonte
Desde a API 17, a
View
classe tem um método estáticogenerateViewId()
que iráfonte
Isso funciona para mim:
fonte
findViewById()
é uma operação lenta. A abordagem funciona, mas à custa do desempenho.(Este foi um comentário à resposta do diletante, mas ficou muito tempo ... hehe)
É claro que uma estática não é necessária aqui. Você pode usar SharedPreferences para salvar, em vez de estático. De qualquer forma, o motivo é salvar o progresso atual para que não seja muito lento para layouts complicados. Porque, de fato, depois de usado uma vez, será bastante rápido mais tarde. No entanto, não acho que seja uma boa maneira de fazê-lo, porque se você precisar reconstruir sua tela novamente (digamos que
onCreate
seja chamado novamente), provavelmente desejará recomeçar do início, eliminando a necessidade de estática. Portanto, apenas faça dela uma variável de instância em vez de estática.Aqui está uma versão menor que roda um pouco mais rápido e pode ser mais fácil de ler:
Esta função acima deve ser suficiente. Porque, até onde eu sei, os IDs gerados pelo Android estão na casa dos bilhões, então isso provavelmente retornará
1
pela primeira vez e sempre será bastante rápido. Porque, na verdade, ele não passará dos IDs usados para encontrar um ID não utilizado. No entanto, o loop é lá que deve realmente encontrar um ID usado.No entanto, se você ainda deseja salvar o progresso entre as recriações subsequentes do seu aplicativo e evitar o uso de estática. Aqui está a versão SharedPreferences:
Esta resposta a uma pergunta semelhante deve informar tudo o que você precisa saber sobre IDs com o Android: https://stackoverflow.com/a/13241629/693927
EDIT / FIX: Acabei de perceber que eu estava totalmente enganado. Eu devo estar bêbado.
fonte
A biblioteca 'Compat' agora também suporta o
generateViewId()
método para níveis de API anteriores a 17.Apenas certifique-se de usar uma versão da
Compat
biblioteca que é27.1.0+
Por exemplo, no seu
build.gradle
arquivo, coloque:implementation 'com.android.support:appcompat-v7:27.1.1
Em seguida, você pode simplesmente usar o
generateViewId()
daViewCompat
classe em vez daView
classe da seguinte maneira://Will assign a unique ID myView.id = ViewCompat.generateViewId()
Feliz codificação!
fonte
Apenas uma adição à resposta de @phantomlimb,
embora
View.generateViewId()
exija nível de API> = 17,essa ferramenta é compatível com toda a API.
de acordo com o nível atual da API,
ele decide o clima usando a API do sistema ou não.
para que você possa usar
ViewIdGenerator.generateViewId()
eView.generateViewId()
ao mesmo tempo e não se preocupe em obter o mesmo IDfonte
for (;;) { … }
vem do Código-fonte do Android.generateViewId()
else { return View.generateViewId(); }
isso vai dar um loop infinito para o nível da API menor que 17 dispositivos?Para gerar dinamicamente a API 17 do formulário do ID da visualização, use
generateViewId ()
O que gerará um valor adequado para uso em
setId(int)
. Este valor não colidirá com os valores de ID gerados no tempo de compilação pelo aapt paraR.id
.fonte
...
fonte
Eu uso:
Usando um número aleatório, sempre tenho uma grande chance de obter o ID exclusivo na primeira tentativa.
fonte
fonte
Minha escolha:
fonte