Diferença entre "@ id /" e "@ + id /" no Android

456

Qual é a diferença entre the @id/e @+id/?

No @+id/símbolo de mais +instrui a criar um novo nome de recurso e adicionar o R.javaarquivo, mas e quanto @id/? Na documentação de ID: ao fazer referência a um recurso Android ID, você não precisa do símbolo de mais, mas deve adicionar o espaço para nome do pacote Android, da seguinte maneira:

android:id="@android:id/list"

Mas na imagem abaixo, o Eclipse não sugere nenhum tipo de @android:id/.

Imagem mostrando a sugestão para @ / id e @ + / id

São @id/e @android:id/iguais?

Vikas Patidar
fonte
De docs Android: (levou uma eternidade para encontrar isso, e eu estava olhando para uma questão não relacionada) developer.android.com/guide/topics/resources/...
Juan Bonfante

Respostas:

351

você se refere a Android resources, que já está definido no sistema Android, com @android:id/..tempo para acessar os recursos que você definiu / criou em seu projeto, você usa@id/..

Mais informações

Conforme seus esclarecimentos no bate-papo, você disse que tem um problema como este:

Se usarmos android:id="@id/layout_item_id", não funciona. Em vez disso @+id/funciona, então qual é a diferença aqui? E essa foi a minha pergunta original.

Bem, isso depende do contexto, quando você está usando o atributo XML de android:id, então você está especificando um novo ID e instruindo o analisador (ou chamá-lo de construtor) para criar uma nova entrada R.java, portanto, você deve inclua um +sinal.

Enquanto, no outro caso, android:layout_below="@id/myTextView"você está se referindo a um ID que já foi criado, portanto o analisador vincula isso ao ID já criado R.java.

Mais informações novamente

Como você disse em seu bate-papo, observe que android:layout_below="@id/myTextView"não reconhecerá um elemento com id myTextViewse ele for escrito após o elemento em que ele está sendo usado.

Aman Alam
fonte
142
Em relação a "Mais informações novamente": é possível definir a posição com android:layout_below="@+id/myTextView"e ENTÃO definir o próprio elemento com android:id="@id/myTextView".
caw
1
@MarcoW Isso me ajudou imensamente. Eu estava tendo problemas para encontrar a solução para esse problema (ou melhor, formular a entrada de pesquisa correta). Eu acho que pode merecer uma pergunta + resposta própria.
precisa
Obrigado! Eu tive o mesmo problema, e a documentação não diz muito sobre esse tópico. Mas é óbvio: O problema que tivemos aqui não é um freqüente ...
caw
7
Eu sempre uso @ + id / no android: id e android: layout_below, isso é um problema?
melanke
4
@melanke: Colocar o +em layout_belowbem como android:idé realmente bom, já que The '+' means to create the symbol if it doesn't already existcomo Tanmay Mandal mencionou em seu agradável (ainda subestimado) resposta. Por esse motivo, também não há efeito de tempo de execução negativo (possivelmente um aumento incomensuravelmente pequeno no tempo de compilação ^ ^).
Levite
86

o sinal + é um atalho para adicionar o ID à sua lista de IDs de recursos. Caso contrário, você precisará tê-los em um arquivo xml como este

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>
Nathan Schwermann
fonte
1
@schwiz: E como podemos usá-lo em nosso layout?
Vikas Patidar 17/02
7
imagine que você tenha o arquivo de recurso que eu defini na minha resposta e, em seu layout, você pode ter <View android:id="@id/my_logo"/> Se você não tiver o arquivo de recurso que eu defini acima, será necessário fazê-lo como <View android:id="@+id/my_logo"/> nota: você só precisa fazer o + id uma vez portanto, se em outro arquivo de layout você fez <View android: id = "+ id / my_logo" />, não seria necessário incluir o caractere '+' na próxima vez em que usar o mesmo ID em um layout.
Nathan Schwermann
@schwiz: Ok, isso é útil, mas onde devemos colocar esse arquivo res/drawable/ou res/layout/ou res/values/qual será o nome desse arquivo? Se você tiver algum link útil sobre isso, poste aqui.
Vikas Patidar
1
Aqui está tudo o que você precisa saber sobre convenções de nomenclatura etc. para seus recursos. Você colocaria o arquivo em res / values ​​/ e a convenção é nomear seus IDs, mas você pode chamá-lo como quiser. desenvolvedor.android.com/guide/topics/resources/…
Nathan Schwermann 21/02
46

Às vezes, você vê referências nos arquivos de layout, como:

<listview id="@+id/android:list">

e

<listview id="@android:id/list">

Qual é a diferença?

.. Fico feliz que você perguntou?

@+id/foosignifica que você está criando um ID chamado foo no espaço para nome do seu aplicativo. Você pode consultar usando @id/foo. @android:id/foosignifica que você está se referindo a um ID definido no namespace do Android.

O '+' significa criar o símbolo se ele ainda não existir. Você não precisa (e não deve usá-lo) ao fazer referência a símbolos android: porque esses já estão definidos para você pela plataforma e você não pode criar seu próprio nesse espaço de nome.

Este espaço para nome é o espaço para nome da estrutura. por exemplo, você precisa usar @android:id/listporque esse é o ID que a estrutura espera encontrar .. (a estrutura sabe apenas sobre os IDs no espaço para nome do Android).

Completamente copiado desta fonte

Tanmay Mandal
fonte
6
Whoosh !! Complete CTRL + C e CTRL + V. feliz que você colocou uma referência à postagem original também. a propósito, é o seu blog?
Aman Alam
se eu declarar no 1º layout @ + id / mybutton do tipo Button, não será necessário criar uma nova instância do if no 2º layout usado como @ id / mybutton. está certo ?
Hiren Dabhi
39

Em resumo

android:id="@+id/my_button"

O sinal + id Plus informa ao android para adicionar ou criar um novo ID em Recursos.

enquanto

android:layout_below="@id/my_button"

apenas ajuda a referenciar o ID já gerado.

Zar E Ahmer
fonte
9

O sinal de adição ( +) antes do tipo de recurso é necessário apenas quando você define um ID de recurso pela primeira vez. Ao compilar o aplicativo, as ferramentas do SDK usam o nome do ID para criar um novo ID do recurso no R.javaarquivo do seu projeto que se refere ao EditTextelemento. Com o ID do recurso declarado dessa maneira, outras referências ao ID não precisam do sinal de mais. O uso do sinal de adição é necessário apenas ao especificar um novo ID de recurso e não é necessário para recursos concretos, como seqüências de caracteres ou layouts. Consulte a caixa lateral para obter mais informações sobre objetos de recursos.

De: https://developer.android.com/training/basics/firstapp/building-ui.html

Nguyen
fonte
6

No Guia do desenvolvedor :

android:id="@+id/my_button"

O símbolo at ( @) no início da sequência indica que o analisador XML deve analisar e expandir o restante da sequência de ID e identificá-la como um recurso de ID. O símbolo de mais ( +) significa que este é um novo nome de recurso que deve ser criado e adicionado aos nossos recursos (no R.javaarquivo). Há vários outros recursos de ID oferecidos pela estrutura do Android. Ao fazer referência a um ID de recurso do Android, você não precisa do símbolo de mais, mas deve adicionar o androidespaço para nome do pacote, assim:

android:id="@android:id/empty"

Jeff Axelrod
fonte
4

Há um erro no Eclipse, onde, às vezes, se você acabou de criar um novo @+id/.., ele não será adicionado imediatamente ao arquivo R.java, mesmo após a construção limpa do projeto. A solução é reiniciar o Eclipse.

Acho que isso deve ser resolvido o mais rápido possível, porque pode (e por experiência própria) confundir alguns desenvolvedores a pensar que há algo errado com sua sintaxe, e tentar depurá-lo, mesmo que não haja realmente nada para depurar.

josephus
fonte
3
Uma das razões pelas quais eu mudei para Android Studio e nunca olhou para trás :) (Eu sei que não estava lá ainda no momento em que escreveu sua resposta)
Konrad Morawski
4

O Android usa alguns arquivos chamados recursos, onde os valores são armazenados para os arquivos XML.

Agora, quando você usa @ id / para um objeto XML, ele está tentando se referir a um ID que já está registrado nos arquivos de valores. Por outro lado, quando você usa @ + id / ele registra um novo ID nos arquivos de valores, conforme implícito no símbolo '+'.

Espero que isto ajude :).

Tanuj Nayak
fonte
4

@id/e @android:id/não é o mesmo.

@id/ID de referência no seu aplicativo, @android:id/referenciando um item na plataforma Android.

Eclipse está errado.

Olegas
fonte
Você está dizendo que @id/ referencing ID in your applicationMas eclise dá Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')quando a usamos para referir o recurso do aplicativo. Então, qual é a diferença entre o @id/e @+id/? Como você pode dizer que o eclipse está errado?
Vikas Patidar
1
O Eclipse está errado no caso de não mostrar uma sugestão @android: id. E você está errado, se você estiver usando @ id / myId sem declarar com @ + id / myId em algum lugar. Todos os @ id / xxx devem ser declarados em algum lugar do seu aplicativo usando @ + id / xxx.
Olegas 17/02/11
Obrigado pelo seu esclarecimento. Acho que aqui o eclipse não está errado, mas mostra sugestões com base no contexto dos nossos elementos de layout. Como mostra @id/apenas no caso deRelativeLayout
Vikas Patidar 18/02/11
2

Diferença entre @+ide @idé:

  • @+idé usado para criar um ID para uma visualização no R.javaarquivo.
  • @id é usado para referenciar o ID criado para a visualização no arquivo R.java.

Usamos @+idwith android:id="", mas e se o ID não for criado e o estivermos referindo antes de ser criado (referência futura).

Nesse caso, usamos @+idpara criar um ID e, ao definir a visualização, temos que referenciá-lo.

Consulte o código abaixo:

<RelativeLayout>

     <TextView
        android:id="@+id/dates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/spinner" />

   <Spinner
     android:id="@id/spinner"
     android:layout_width="96dp"
     android:layout_height="wrap_content"
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

No código acima, o ID para o Spinner @+id/spinneré criado em outra visualização e, ao definir o spinner, estamos nos referindo ao ID criado acima.

Portanto, precisamos criar o ID se estiver usando a visualização antes que ela seja criada.

Kunal Sale
fonte
1

Diferença entre “@+id/”e “@id/”no Android

O primeiro é usado para criar o IDcomponente ui específico e o outro é usado para referenciar o componente específico

Gurpreet Singh
fonte
1

Se o item de exibição executar a mesma operação, você poderá usá-lo @+idpara cada entrada em qualquer layout, pois durante a compilação de vários, @+id/fooo R.javaarquivo cria apenas uma enumeração. Por exemplo, se eu tiver um botão Salvar em cada página que executa a mesma operação, eu uso android:id="@+id/button_save"em cada layout. O arquivo R.java possui apenas uma entrada para o botão_salvar.

TheChrisONeil
fonte