Até agora, você configurou tudo e o Android Studio criou muitos códigos. Antes de modificar todo esse código, é importante saber o que você acabou de criar e como navegar pelos arquivos fonte de um aplicativo Android.
Neste tutorial, você aprende mais sobre os principais componentes de um aplicativo Android e adiciona interatividade simples a um aplicativo com um botão.
MainActivity
Kotlin e o arquivo de layout da atividade. Button
ao layout da atividade.Button
.
Neste tutorial, você cria um projeto de aplicativo chamado DiceRoller e adiciona interatividade básica com um botão. Cada vez que o botão é clicado, o valor do texto exibido muda. O aplicativo DiceRoller final para este tutorial se parece com este:
No último tutorial, você aprendeu sobre as partes principais de um projeto de aplicativo, incluindo os
diretórios java
e res
. Nesta tarefa, você se concentra nos dois arquivos mais
importantes que compõem seu aplicativo: O arquivo MainActivity
Kotlin e o arquivo de layout
activity_main.xml
.
MainActivity
é um exemplo de uma Activity
. Uma Activity
é uma classe
Android principal que desenha uma interface de usuário (IU) de aplicativo Android e recebe eventos de entrada.
Quando seu aplicativo é iniciado, ele inicia a atividade especificada no arquivo
AndroidManifest.xml
.
Muitas linguagens de programação definem um método principal que inicia o programa. Os aplicativos Android não
possuem um método principal. Em vez disso, o arquivo AndroidManifest.xml
indica que
MainActivity
deve ser iniciado quando o usuário toca no ícone do iniciador do aplicativo. Para
iniciar uma atividade, o sistema operacional Android usa as informações no manifesto para configurar o ambiente
para o aplicativo e construir a MainActivity
. Em seguida, a MainActivity
faz algumas
configurações sucessivamente.
Cada atividade possui um arquivo de layout associado. A atividade e o layout são conectados por um processo conhecido como inflação do layout. Quando a atividade começa, as vistas definidas nos arquivos de layout XML são transformadas (ou "infladas" em) objetos de vistas Kotlin na memória. Assim que isso acontecer, a atividade pode desenhar esses objetos na tela e também modificá-los dinamicamente.
MainActivity
.MainActivity
. A classe MainActivity
estende AppCompatActivity
. class MainActivity : AppCompatActivity() { ...
onCreate()
. As atividades não usam um construtor para inicializar o objeto. Em
vez disso, uma série de métodos predefinidos (chamados "métodos de ciclo de vida") são chamados como parte da
configuração da atividade. Um desses métodos de ciclo de vida é onCreate()
, que você sempre
substitui em seu próprio aplicativo. Você aprenderá mais sobre os métodos de ciclo de vida em um tutorial
posterior.onCreate()
, você especifica qual layout está associado à atividade e infla o
layout. O método setContentView()
faz ambos. override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
O método setContentView()
faz referência ao layout usando R.layout.activity_main
,
que, na verdade, é uma referência inteira. A classe R
é gerada quando você constrói seu aplicativo.
A classe R
inclui todos os recursos do aplicativo, incluindo o conteúdo do diretório
res
.
Neste caso, R.layout.activity_main
se refere à classe R
gerada, a pasta
layout
e o activity_main.xml
arquivo de layout. (Os recursos não incluem extensões de
arquivo). Você se referirá a muitos dos recursos do aplicativo (incluindo imagens, strings e elementos no
arquivo de layout) usando referências semelhantes na classe R
.
Todas as atividades em seu aplicativo possuem um arquivo de layout associado no diretório
res/layout
do aplicativo. Um arquivo de layout é um arquivo XML que expressa a aparência
real de uma atividade. Um arquivo de layout faz isso definindo vistas e definindo onde as vistas aparecem na
tela.
Vistas são algo como texto, imagens e botões que estendem a classe View
. Existem muitos
tipos de vistas, incluindo TextView
, Button
, ImageView
e
CheckBox
.
Nesta tarefa, você examina e modifica o arquivo de layout do aplicativo.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
Agora examine o código:
<LinearLayout>
. A vista
LinearLayout
é um ViewGroup
. Grupos de vistas são contêineres que contêm outras
vistas e ajudam a especificar as posições das vistas na tela. ConstraintLayout
, que funciona bem em coordenação com o editor de design. Para este aplicativo,
você usa um grupo de vistas LinearLayout
, que é mais simples do que o layout de restrição. Você
aprenderá muito mais sobre grupos de vistas e layout de restrição na próxima lição.LinearLayout
, observe o atributo android:layout_width
. A
largura deste LinearLayout
é configurada para match parent
, o que o torna da mesma
largura de seu pai. Como esta é a vista raiz, o layout se expande para a largura total da tela.android:layout_height
, que é definido como wrap_content
. Este
atributo faz com que a altura do LinearLayout
corresponda à altura combinada de todas as vistas
que ele contém, que por enquanto é apenas o TextView
.<TextView>
. Este TextView
, que exibe texto, é o único
elemento visual em seu aplicativo DiceRoller. O atributo android:text
contém a string real a ser
exibida, neste caso, a string "Hello World!"
android:layout_width
e android:layout_height
no elemento
<TextView>
, ambos definidos como wrap_content
. O conteúdo da vista de texto é
o próprio texto, portanto, a vista ocupará apenas o espaço necessário para o texto. O aplicativo de lançamento de dados não é muito útil sem uma maneira do usuário rolar os dados e ver o que eles rolaram. Para começar, adicione um botão ao layout para lançar os dados e adicione um texto que mostre o valor dos dados que o usuário lançou.
Button
ao layout abaixo da vista de texto inserindo
<Button e pressione Return. Um bloco Button
aparece que termina com
/>
e inclui os atributos layout_width
e layout_height
. <Button
android:layout_width=""
android:layout_height="" />
layout_width
e layout_height
como "wrap_content"
.
Com esses valores, o botão tem a mesma largura e altura do rótulo de texto que contém.android:text
ao botão e atribua a ele o valor "Roll". O elemento Button
agora se parece com isto: <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Roll" />
Para vistas de Button
, o atributo text
é o rótulo do botão. No editor de layout,
o atributo é destacado em amarelo, o que indica uma dica ou um aviso. Nesse caso, o destaque amarelo é porque a
string "Roll"
está codificada no rótulo do botão, mas a string deve ser um recurso. Você aprenderá
sobre os recursos de string na próxima seção.
Em vez de codificar strings em seu layout ou arquivos de código, é uma prática recomendada colocar todas as
strings de seu aplicativo em um arquivo separado. Este arquivo é denominado strings.xml
e está
localizado entre os recursos do aplicativo, no diretório res/values/
.
Tendo as strings em um arquivo separado torna mais fácil gerenciá-las, especialmente se você usar essas strings mais de uma vez. Além disso, os recursos de string são obrigatórios para traduzir e localizar seu aplicativo, pois você precisa criar um arquivo de recurso de string para cada idioma.
O Android Studio ajuda você a se lembrar de colocar suas strings em um arquivo de recurso com dicas e avisos.
android:text
da etiqueta
<Button>
. Alt+Enter
(Option+Enter
no macOS) e selecione Extract string
resource no menu pop-up.roll_label
para o Resource name.res/values/string.xml
e
a string no elemento Button é substituída por uma referência a esse
recurso:android:text="@string/roll_label"
strings.xml
:
<resources>
<string name="app_name">DiceRoller</string>
<string name="roll_label">Roll</string>
</resources>
Seu layout agora contém uma vista TextView
e uma vista Button
. Nesta tarefa, você
organiza as vistas dentro do grupo de vistas para parecerem mais atraentes.
android:orientation
à etiqueta LinearLayout
e atribua a ele um valor de
"vertical"
. O elemento <LinearLayout>
agora deve ter a seguinte aparência:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity">
O grupo de vistas LinearLayout
posiciona as vistas que contém uma após a outra em uma linha, seja
horizontalmente em uma linha ou verticalmente em uma pilha. Horizontal é o padrão. Como você deseja que o
TextView
seja empilhado sobre o Button
, defina a orientação como vertical. O design
agora se parece com isto, com o botão abaixo do texto:
android:layout_gravity
ao TextView
e ao Button
e
atribua a ele o valor "center_horizontal"
. Isso alinha ambas as vistas ao longo do centro do eixo
horizontal. Os elementos TextView e Button agora devem ter a seguinte aparência:<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Hello World!" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/roll_label" />
android:layout_gravity
ao layout linear e atribua a ele o valor de
"center_vertical"
. Seu elemento LinearLayout
agora deve ter a seguinte aparência:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_vertical"
tools:context=".MainActivity">
android:textSize
ao
elemento <TextView>
com o valor "30sp"
. A abreviatura sp significa
pixels dimensionáveis , que é uma medida para dimensionar o texto independentemente da qualidade da
tela do dispositivo. O elemento TextView agora deve ter a seguinte aparência:<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="30sp"
android:text="Hello World!" />
Agora, tanto o texto quanto o botão estão bem posicionados e há um texto maior na vista de texto. O botão ainda não tem nenhuma funcionalidade, então nada acontece quando você clica nele. Você trabalha nisso a seguir.
O código Kotlin em MainActivity
é responsável por definir as partes interativas do seu aplicativo,
como o que acontece quando você toca em um botão. Para escrever uma função que é executada quando o botão é
clicado, você precisa obter uma referência ao objeto Button em seu layout inflado em MainActivity. Para obter
uma referência ao botão:
Button
um ID no arquivo XML.findViewById()
em seu código para obter uma referência à View
com um ID específico.Depois de ter uma referência à vista Button
, você pode chamar métodos nessa vista para alterá-la
dinamicamente à medida que o aplicativo é executado. Por exemplo, você pode adicionar um tratador de cliques que
executa o código quando o botão é pressionado.
activity_main.xml
, se ainda não estiver aberto, e clique na guia
Text. android:id
ao botão e provenha a ele um nome (neste caso,
"@+id/roll_button"
). Seu elemento <Button>
agora se parece com isto:<Button
android:id="@+id/roll_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/roll_label" />
Quando você cria um ID para uma vista no arquivo de layout XML, o Android Studio cria uma constante de número
inteiro com o nome desse ID na classe R
gerada. Portanto, se você nomear uma vista
roll_button
, o Android Studio gera e cria uma constante de número inteiro chamada
roll_button
na classe R
. O prefixo "@+id"
para o nome do ID diz ao
compilador para adicionar essa constante de ID à classe R. Todos os IDs de vistas da propriedade em seu arquivo
XML devem ter este prefixo.
MainActivity
Kotlin. Dentro de onCreate()
, depois de
setContentView()
, adicione esta linha: val rollButton: Button = findViewById(R.id.roll_button)
Use o método findViewById()
para obter uma referência de View
para a vista que você
definiu na classe XML. Neste caso, você obtém a referência do Button
da classe R
e o
ID roll_button
e atribui essa referência ao rollButton
.
Button
em vermelho e a sublinha, para indicar que
é uma referência não resolvida e que você precisa importar esta classe antes de poder usá-la. Uma dica de
ferramenta indicando o nome de classe qualificado também pode aparecer:Alt+Enter
(Option+Enter
em um Mac) para aceitar o nome de classe
qualificado.
Um tratador de clique é um método que é invocado cada vez que o usuário clica ou toca em um elemento clicável da IU, como um botão. Para criar um gerenciador de cliques, você precisa:
setOnClickListener()
, que conecta o Button
ao método tratador.
Nesta tarefa, você cria um método de tratador de cliques para exibir um Toast
. (Um toast
é uma mensagem que aparece na tela por um curto período). Você conecta o método do tratador de cliques ao
Button
.
MainActivity
após onCreate()
, crie uma função privada chamada
rollDice()
. private fun rollDice() {
}
rollDice()
para exibir um Toast
quando
rollDice()
é chamado:Toast.makeText(this, "button clicked",
Toast.LENGTH_SHORT).show()
Para criar um toast, chame o método Toast.makeText()
. Este método requer três objetos:
Context
. O objeto Context
permite que você se comunique e
obtenha informações sobre o estado atual do sistema operacional Android. Você precisa de um
Context
aqui para que o objeto Toast
possa dizer ao SO para exibir a notificação.
Como AppCompatActivity
é uma subclasse de Context
, você pode apenas usar a
palavra-chave this
para o contexto. "button clicked"
.show()
no final exibe o toast.onCreate()
, após a chamada para findViewById()
adicione esta linha para
atribuir rollDice()
como um tratador de clique para o rollButton
: rollButton.setOnClickListener { rollDice() }
A definição completa de sua classe MainActivity
agora se parece com isto:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.roll_button)
rollButton.setOnClickListener { rollDice() }
}
private fun rollDice() {
Toast.makeText(this, "button clicked",
Toast.LENGTH_SHORT).show()
}
}
Nesta tarefa, você modifica o método rollDice()
para alterar o texto em TextView
.
Para a primeira etapa, você altera esse texto de "Hello World!"
para a string
"Dice Rolled!"
. Para a segunda etapa, você exibe um número aleatório entre um e seis.
activity_main.xml
e adicione um ID ao TextView
. android:id="@+id/result_text"
MainActivity
. No método rollDice()
, comente a linha para exibir o
Toast
. findViewById()
para obter uma referência ao TextView
por seu ID.
Atribua a referência a uma variável resultText
. val resultText: TextView = findViewById(R.id.result_text)
resultText.text
para alterar o texto exibido. Você pode
ignorar a dica para extrair essa string em um recurso; esta é apenas uma string temporária.resultText.text = "Dice Rolled!"
TextView
. Finalmente, nesta tarefa você adiciona aleatoriedade ao clique do botão, para simular o lançamento dos dados.
Cada vez que o botão é clicado ou tocado, seu código escolhe um número aleatório de 1 a 6 e atualiza o
TextView
. A tarefa de gerar um número aleatório não é específica do Android e você usa a função
Random
no intervalo para fazê-lo.
rollDice()
, use o método (1..6).random()
para obter um número
aleatório entre 1 e 6: val randomInt = (1..6).random()
text
para o valor do número inteiro aleatório, como uma string:resultText.text = randomInt.toString()
Projeto Android Studio: DiceRoller
Desafio: adicione um segundo botão ao aplicativo denominado "Count Up" que aparece logo abaixo do botão Roll. Quando tocado, o botão Count Up deve obter o valor atual da vista do texto do resultado, adicionar 1 a ele e atualizar a vista do texto. Certifique-se de tratar com estes casos extremos:
Projeto Android Studio: desafio DiceRoller
MainActivity
é uma subclasse de AppCompatActivity
, que por sua vez é uma subclasse
de Activity
. Uma Activity
é uma classe Android principal responsável por desenhar a
IU do aplicativo Android e receber eventos de entrada.activity_main.xml
. setContentView()
em MainActivity
associa o layout à atividade e infla
esse layout quando a atividade é criada.Activity
pode desenhar esses objetos na tela e modificá-los dinamicamente.View
e
são chamados de views. TextView
e Button
são exemplos de vistas.
View
podem ser agrupados dentro de um ViewGroup
. Um grupo de exibição atua como um contêiner para as exibições,
ou outros grupos de exibição, dentro dele. LinearLayout
é um exemplo de um grupo de vistas que
organiza suas vistas linearmente.
android:layout_width
e android:layout_height
indicam a largura e a
altura de uma vista. O valor match_parent
estende a vista até a largura ou altura de seu pai. O
valor wrap_content
reduz a vista para caber no conteúdo da vista.android:text
indica o texto que uma vista deve exibir (se essa vista exibir texto).
Para botões, android:text
é o rótulo do botão. android:orientation
em um grupo de vistas LinearLayout
organiza os
elementos de vistas que ele contém. Um valor de horizontal
organiza as vistas da esquerda para a
direita. Um valor de vertical
organiza as vistas de cima para baixo. android:layout_gravity
determina o posicionamento de uma vista e todos os filhos
dessa vista. android:textSize
define o tamanho do texto em uma vista de texto. Os tamanhos do
texto são especificados em unidades sp (pixels dimensionáveis). Ao usar unidades sp, você pode
dimensionar o texto independentemente da qualidade da tela do dispositivo.values/res/string.xml
.Alt+Enter
(Option+Enter
em um Mac). Selecione
Extract string resources no menu pop-up.android:id
) à vista no layout e,
em seguida, use o método findViewById()
para obter o objeto de vistas associado. R
gerada. Você pode então usar essa referência
R.id
no método findViewById()
.android:text
no
XML e é definido pela propriedade text
em Kotlin. setOnClickListener()
.Um toast é uma vista que mostra ao usuário uma mensagem simples em uma pequena janela pop-up.
Para criar um toast, chame o método fábrica makeText()
na classe Toast
com três argumentos:
Activity
Toast.LENGTH_SHORT
Para exibir o toast, chame show()
.
Documentação para desenvolvimento em Android:
View
Button
TextView
findViewById()
setOnClickListener()
Context
De outros:
Esta seção lista as possíveis tarefas de casa para os alunos que estão trabalhando neste tutorial como parte de um curso ministrado por um instrutor.
Abra o aplicativo DiceRoller. Adicione um botão ao aplicativo denominado "Reset" que aparece logo abaixo do botão Roll. Faça com que esse botão reinicie a vista do texto do resultado para 0.
Qual método em uma Activity
infla o layout do aplicativo e disponibiliza suas vistas como objetos?
onCreate()
setClickListener()
setContentView()
show()
Qual atributo de vistas você usa para definir a largura de uma vista para que se ajuste ao conteúdo?
android:view_width="wrap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="match_parent"
Verifique se o aplicativo tem o seguinte:
Comece a próxima lição:
Para obter enlaces para outros tutoriais neste curso, consulte a página de destino dos tutoriais Fundamentos de Android em Kotlin.