Iniciar outra atividade

Ao concluir a lição anterior, você terá um app que exibe uma atividade (uma só tela) com um campo de texto e um botão. Nesta lição, você adicionará um código a MainActivity para iniciar uma nova atividade para exibir a mensagem quando o usuário tocar em Send.

Observação: esta lição pressupõe que você esteja usando o Android Studio 3.0 ou uma versão posterior.

Responder ao botão "Send"

Adicione um método à classe MainActivity, que será chamado pelo botão da seguinte maneira:

  1. No arquivo app > java > com.example.myfirstapp > MainActivity, adicione o stub do método sendMessage(), conforme mostrado abaixo:

    Kotlin

        class MainActivity : AppCompatActivity() {
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
            }
    
            /** Called when the user taps the Send button */
            fun sendMessage(view: View) {
                // Do something in response to button
            }
        }
        

    Java

        public class MainActivity extends AppCompatActivity {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
            }
    
            /** Called when the user taps the Send button */
            public void sendMessage(View view) {
                // Do something in response to button
            }
        }
        

    Talvez seja exibido um erro, porque o Android Studio não pode resolver a classe View usada como argumento do método. Portanto, clique para colocar o cursor na declaração View e execute um Reparo rápido pressionando Alt + Enter (ou Option + Enter, no Mac). Se um menu for exibido, selecione Import class.

  2. Retorne ao arquivo activity_main.xml para chamar esse método pelo botão:
    1. Clique para selecionar o botão no Layout Editor.
    2. Na janela Attributes, localize a propriedade onClick e selecione sendMessage [MainActivity] na lista suspensa.

Agora, ao tocar no botão, o sistema chamará o método sendMessage().

Observe os detalhes desse método que são necessários para que o sistema o reconheça como compatível com o atributo android:onClick. Especificamente, o método tem as seguintes características:

  • Acesso público
  • Um vazio ou, na linguagem Kotlin, um valor de retorno unit implícito
  • Um View como único parâmetro (trata-se do objeto View que foi clicado)

A seguir, você preencherá esse método para ler o conteúdo do campo de texto e enviar esse texto a outra atividade.

Criar um intent

Um Intent é um objeto que fornece vínculos de tempo de execução entre componentes separados, como duas atividades. O Intent representa uma "intenção de fazer algo" do app. Você pode usar intents para uma ampla variedade de tarefas, mas o intent iniciará outra atividade nesta lição.

Em MainActivity, adicione a constante EXTRA_MESSAGE e o código sendMessage(), conforme mostrado aqui:

Kotlin

    const val EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }

        /** Called when the user taps the Send button */
        fun sendMessage(view: View) {
            val editText = findViewById<EditText>(R.id.editText)
            val message = editText.text.toString()
            val intent = Intent(this, DisplayMessageActivity::class.java).apply {
                putExtra(EXTRA_MESSAGE, message)
            }
            startActivity(intent)
        }
    }
    

Java

    public class MainActivity extends AppCompatActivity {
        public static final String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }

        /** Called when the user taps the Send button */
        public void sendMessage(View view) {
            Intent intent = new Intent(this, DisplayMessageActivity.class);
            EditText editText = (EditText) findViewById(R.id.editText);
            String message = editText.getText().toString();
            intent.putExtra(EXTRA_MESSAGE, message);
            startActivity(intent);
        }
    }
    

O Android Studio encontrará novamente erros Cannot resolve symbol. Por isso, pressione Alt + Enter (ou Option + Return, no Mac). Suas importações precisam resultar em:

Kotlin

    import android.content.Intent
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import android.view.View
    import android.widget.EditText
    

Java

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    

Um erro para DisplayMessageActivity permanece, mas isso não é um problema. Você o corrigirá na próxima seção.

Veja o que está acontecendo em sendMessage():

  • O criador do Intent usa dois parâmetros:
    • Um Context como o primeiro parâmetro (this é usado porque a classe Activity é uma subclasse de Context)
    • A Class do componente do app ao qual o sistema precisa enviar o Intent (nesse caso, a atividade que precisa ser iniciada)
  • O método putExtra() adiciona o valor de EditText ao intent. Um Intent pode carregar tipos de dados como pares de chave-valor chamados de extras. Sua chave é uma EXTRA_MESSAGE pública constante porque a próxima atividade usa a chave para recuperar o valor de texto. É recomendável definir chaves para extras de intents usando o nome do pacote do app como prefixo. Isso garante que as chaves sejam únicas caso seu app interaja com outros.
  • O método startActivity() inicia uma instância da DisplayMessageActivity especificada pelo Intent. Agora, você precisa criar essa classe.

O Navigation Architecture Component, atualmente em Alfa, permite que você use o Navigation Editor para associar uma atividade a outra. Depois que o relacionamento é criado, você pode usar a API para iniciar a segunda atividade quando o usuário acionar a ação associada (por exemplo, clicar em um botão). Para saber mais, consulte Navigation Architecture Component.

Criar a segunda atividade

  1. Na janela Project, clique com o botão direito do mouse na pasta app e selecione New > Activity > Empty Activity.
  2. Na janela Configure Activity, digite "DisplayMessageActivity" em Activity Name e clique em Finish. Deixe as demais propriedades definidas como os valores padrão.

O Android Studio faz três coisas automaticamente:

  • Cria o arquivo DisplayMessageActivity.
  • Cria o arquivo de layout activity_display_message.xml correspondente.
  • Adiciona o elemento <activity> necessário em AndroidManifest.xml.

Se você executar o app e tocar no botão na primeira atividade, a segunda atividade será iniciada, mas estará vazia. Isso ocorre porque a segunda atividade utiliza o layout vazio fornecido pelo modelo.

Adicionar uma visualização de texto

Figura 1. A visualização de texto centralizada no topo do layout

A nova atividade incluirá um arquivo de layout vazio, portanto, agora você adicionará uma visualização de texto em que a mensagem será exibida.

  1. Abra o arquivo app > res > layout > activity_display_message.xml.
  2. Clique em Turn On Autoconnect na barra de ferramentas (a opção estará ativa, conforme mostrado na figura 1).
  3. Na janela Pallete, clique em Text e arraste uma TextView para o layout. Coloque-a no topo do layout, próxima ao centro, para que ela se encaixe na linha vertical exibida. O Autoconnect adiciona limitações esquerda e direita para colocar a visualização no centro horizontal.
  4. Crie mais uma limitação do topo da visualização de texto para o topo do layout, de forma que ela apareça como é mostrado na figura 1.

Opcionalmente, faça ajustes ao estilo do texto expandindo textAppearance na janela Attributes e altere atributos como textSize e textColor.

Exibir a mensagem

Agora, você modificará a segunda atividade para exibir a mensagem que foi passada pela primeira.

  1. Em DisplayMessageActivity, adicione o seguinte código ao método onCreate():

    Kotlin

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_display_message)
            
            // Get the Intent that started this activity and extract the string
            val message = intent.getStringExtra(EXTRA_MESSAGE)
    
            // Capture the layout's TextView and set the string as its text
            val textView = findViewById<TextView>(R.id.textView).apply {
                text = message
            }
        }
        

    Java

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_display_message);
            
            // Get the Intent that started this activity and extract the string
            Intent intent = getIntent();
            String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    
            // Capture the layout's TextView and set the string as its text
            TextView textView = findViewById(R.id.textView);
            textView.setText(message);
        }
        
  2. Pressione Alt+Enter (ou Option+Return no Mac) para importar classes que estejam faltando. Suas importações precisam resultar em:

    Kotlin

        import android.content.Intent
        import android.support.v7.app.AppCompatActivity
        import android.os.Bundle
        import android.widget.TextView
        

    Java

        import android.content.Intent;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.widget.TextView;
        

Adicionar navegação

Cada uma das telas do seu app que não seja a principal (ou seja, todas as telas que não sejam a "inicial") precisa oferecer navegação para que o usuário possa retornar à tela pai lógico na hierarquia do app ao tocar no botão "Up" da barra do app.

Basta declarar qual atividade é o pai lógico no arquivo AndroidManifest.xml. Portanto, abra o arquivo em app > manifests > AndroidManifest.xml, localize a tag <activity> para DisplayMessageActivity e substitua-a pelo seguinte:

    <activity android:name=".DisplayMessageActivity"
              android:parentActivityName=".MainActivity">
        <!-- The meta-data tag is required if you support API level 15 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>
    

Agora, o sistema Android automaticamente adicionará o botão "Up" à barra do app.

Executar o app

Execute o app novamente clicando em Apply Changes na barra de ferramentas. Quando ele for aberto, digite uma mensagem no campo de texto e toque em Send para que ela seja exibida na segunda atividade.

Figura 2. Captura de tela das duas atividades

Pronto, você criou seu primeiro app Android!

Para continuar aprendendo as noções básicas do desenvolvimento de apps Android, siga os outros links fornecidos na página principal deste tutorial.