Qual é a classe R no Android?

90

No AndroidStudio, quando crio um projeto usando uma atividade vazia, obtenho o seguinte trecho de código no MainActivity.javaarquivo:

package my.company.my_proj;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

onde uma classe criptografada chamada Ré usada. Qual é o objetivo desta aula R?

Véspera de Android
fonte

Respostas:

117

Ré uma classe que contém as definições de todos os recursos de um pacote de aplicativo específico . Ele está no namespace do pacote do aplicativo .

Por exemplo, se você disser em seu manifesto que seu nome de pacote é com.foo.bar, uma Rclasse será gerada com os símbolos de todos os seus recursos em com.foo.bar.R.

Geralmente, há duas R classes com as quais você lidará

  1. Os recursos da estrutura em android.Re
  2. Seu próprio, em seu namespace

Ele é nomeado Rporque significa R esources, e não há nenhum ponto em fazer as pessoas digitarem algo mais longo, especialmente porque é comum terminar com nomes de símbolo razoavelmente longos depois dele, o que pode causar uma boa quantidade de quebra de linha.

hackbod
fonte
10
Depois de resolver todos os problemas e prosseguir com o livro, posso adicionar (do livro): Esta é uma classe de utilitário gerada automaticamente que fornece referências para os recursos no projeto. É chamada de "classe R" porque seu nome é R.java . É gerado pelo AAPT a partir dos recursos definidos na pasta res .
Android Eve
1
O que é android.R?
Malwinder Singh
12
Há um ponto em fazer as pessoas digitarem algo mais: é chamado de código limpo e pode não ter alcançado todos ainda. Classes, extensões e variáveis ​​de uma letra podem ser adequadas em um contexto local, mas nunca globalmente. Nomes feios como esse levam a perguntas redundantes como essa.
brainray
23

O que é R: Não há nada de muito misterioso sobre R. É apenas uma classe que tem muitas subclasses estáticas, abra-a no eclipse e dê uma olhada (está sob gen /).

Cada membro desta classe é uma de duas coisas: 1) classes finais estáticas ou 2) inteiros finais estáticos que são únicos em relação aos outros membros de sua classe.

Por que é tão enigmático: é fácil se confundir porque R é gerado automaticamente pela formiga. É enigmático porque você não deve "tocá-lo" manualmente (é claro que pode, mas suas alterações serão automaticamente apagadas na regeneração). Além disso, é enigmático porque às vezes o eclipse importa automaticamente o arquivo R padrão do android (conforme discutido nas respostas acima)

Por que é sempre o primeiro que não pode ser resolvido: R segue exatamente as regras das classes e pacotes Java, não há nada de especial em como o R atua com relação à importação. R será automaticamente colocado no pacote especificado pela entrada do pacote em seu arquivo de manifesto

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="package.which.will.contain.R.and.probably.the.main.package.in.the.application" android:versionName="8.6.2011" android:versionCode="1">
    <uses-sdk android:minSdkVersion="13" />

Para ver a qual pacote seu arquivo R pertence, basta abrir a pasta gen / no eclipse (visualização de pacotes). Você verá um pacote listado lá, ele terá o nome que você especificou em seu manifesto. Tente excluí-lo, ele voltará se todos os seus recursos seguirem as regras de nomenclatura corretas e todos os seus arquivos xml seguirem as regras xml corretas e se a construção automática for habilitada no eclipse.

A chave para entender o arquivo R é perceber que ele está no mesmo pacote que as outras classes, embora esteja em um diretório diferente de outros arquivos pertencentes ao seu pacote "principal". Depois de entender isso e entender a sintaxe e a nomenclatura dos arquivos de recursos, é fácil solucionar problemas com o R.

tjb
fonte
3

R é o nome dos seus recursos. Qualquer recurso que você acessa R.$FOLDER.$RESOURCEou algo muito semelhante.

Se não puder ser resolvido, verifique se o caminho está correto e se o recurso referenciado existe (diferencia maiúsculas de minúsculas; inclua a extensão).

Além disso, a parte confusa (para mim, pelo menos) é que existem dois R's diferentes . Se você estiver recebendo muitos erros "Não pode ser resolvido", tente ver o que está importando. Tente alterá-lo ou removê-lo. Ou você pode tentar limpar seu projeto (AVISO: às vezes isso torna as coisas piores do que já estão).

John
fonte
Sim, limpar meu projeto parece ser uma rotina diária - eclipse está sempre enlouquecendo e esquecendo as coisas, mas uma boa limpeza parece consertar as coisas (embora eu nunca tenha visto as coisas estarem piores do que já estão, como John menciona) .
Brian D
@Brian: Quando eu limpo meu projeto, o Eclipse destrói e regenera meu Rarquivo. De vez em quando, ele perde a etapa de "regeneração", deixando-me sem (ou com um vazio) Re Ré programado para desfazer automaticamente quaisquer alterações feitas à mão.
João
@John: qual sistema operacional você está usando, só por curiosidade?
Brian D
@John, Limpeza não ajuda no meu caso. Você pode ver a lista real de erros neste tópico (que ainda não foi respondida): stackoverflow.com/questions/4928784/…
Android Eve
1

Android R.java é um arquivo gerado automaticamente pelo AAPT (Android Asset Packaging Tool) que contém IDs de recursos para todos os recursos do diretório res /. Se você criar qualquer componente no arquivo activity_main.xml, o id para o componente correspondente é criado automaticamente neste arquivo. Este id pode ser usado no arquivo de origem da atividade para realizar qualquer ação no componente.

Sahil
fonte