別のアクティビティを開始する

前のレッスンを完了すると、アプリが作成され、アクティビティが表示されます。このアクティビティは、テキスト フィールドと送信ボタンを備えた 1 つの画面で構成されています。このレッスンでは、ユーザーが送信ボタンをタップしたときに、新しいアクティビティを開始してメッセージを表示するコードを MainActivity に追加します。

送信ボタンに応答する

以下の操作を実行して、送信ボタンがタップされたときに呼び出されるメソッドを MainActivity クラスに追加します。

  1. app > java > com.example.myfirstapp > MainActivity ファイルで、次の sendMessage() メソッドスタブを追加します。

    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
            }
        }
        

    メソッドの引数として使用される View クラスを Android Studio が解決できないため、エラーが表示される場合があります。このエラーをクリアするには、View 宣言をクリックし、そこにカーソルを置いて Alt+Enter(Mac の場合は Option+Enter)を押して、クイック修正を行います。メニューが表示された場合は、[Import class] を選択します。

  2. activity_main.xml ファイルに戻って、ボタンからメソッドを呼び出します。
    1. Layout Editor でボタンを選択します。
    2. [Attributes] ウィンドウで [onClick] プロパティを見つけ、プルダウン リストから [sendMessage [MainActivity]] を選択します。

    これで、ボタンをタップすると sendMessage() メソッドが呼び出されます。

    このメソッドの詳細に注意してください。この詳細は、メソッドが android:onClick 属性と互換性があることをシステムで認識するために必要です。具体的には、このメソッドには次のような特性があります。

    • 公開アクセス
    • void または暗黙的なユニット戻り値(Kotlin の場合)
    • View のみをパラメータとして持つこと。これは、手順 1 の最後でクリックした View オブジェクトです。
  3. 次に、テキスト フィールドのコンテンツを読み込むようにこのメソッドを設定し、そのテキストを別のアクティビティに送ります。

インテントを作成する

Intent は、異なるコンポーネント(2 つのアクティビティなど)間で実行時バインディングを付与するオブジェクトです。Intent はアプリの「何かを行うという意図」を表します。インテントは幅広いタスクで用いることができますが、このレッスンでは別のアクティビティを開始するために使われます。

次に示すように、MainActivityEXTRA_MESSAGE 定数と sendMessage() コードを追加します。

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);
        }
    }
    

Android Studio で [Cannot resolve symbol] エラーが再度表示されます。エラーをクリアするには、Alt+Enter(Mac の場合は Option+Return)を押します。インポート内容は次のようになります。

Kotlin

    import androidx.appcompat.app.AppCompatActivity
    import android.content.Intent
    import android.os.Bundle
    import android.view.View
    import android.widget.EditText
    

Java

    import androidx.appcompat.app.AppCompatActivity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    

DisplayMessageActivity のエラーは残っていても問題ありません。これは次のセクションで修正できます。

sendMessage() で起こっていることを次に示します。

  • Intent コンストラクタには、ContextClass の 2 つのパラメータがあります。

    Context パラメータは、Activity クラスが Context のサブクラスであるため、最初に使用されます。

    アプリ コンポーネントの Class パラメータには Intent, が送信されます。ここでは開始されるアクティビティです。

  • putExtra() メソッドは EditText の値をインテントに追加します。Intent では、extras というキーと値のペアでデータ型をやり取りできます。

    使用するキーは EXTRA_MESSAGE というパブリック定数で、次のアクティビティでこのキーを使用してテキスト値を取得します。インテントのエクストラのキーを接頭語としてアプリのパッケージ名を付けて定義すると、アプリが他のアプリと連携する場合に、キーを一意に識別できるようになります。

  • startActivity() メソッドは、Intent で指定された DisplayMessageActivity のインスタンスを開始します。次に、そのクラスを作成する必要があります。

2 番目のアクティビティを作成する

2 番目のアクティビティを作成する手順は次のとおりです。

  1. [Project] ウィンドウで app フォルダを右クリックし、[New] > [Activity] > [Empty Activity] を選択します。
  2. [Configure Activity] ウィンドウの [Activity Name] に「DisplayMessageActivity」と入力します。他のすべてのプロパティはデフォルトのままにして、[Finish] をクリックします。

Android Studio は自動的に次の 3 つの処理を実行します。

  • DisplayMessageActivity ファイルを作成します。
  • activity_display_message.xml レイアウト ファイルを作成します。これは DisplayMessageActivity ファイルに対応します。
  • 必要な <activity> 要素を AndroidManifest.xml に追加します。

このアプリを実行して 1 つ目のアクティビティでボタンをタップすると、2 つ目のアクティビティが開始されますが、中身は空です。これは、2 つ目のアクティビティが、テンプレートで提供された空のレイアウトを使用しているためです。

テキストビューを追加する

レイアウトの上部中央に配置されたテキストビュー。
図 1. レイアウトの上部中央に配置されたテキストビュー

新しいアクティビティには空のレイアウト ファイルが含まれています。次の手順でメッセージが表示される場所にテキストビューを追加します。

  1. app > res > layout > activity_display_message.xml ファイルを開きます。
  2. ツールバーの Enable Autoconnection to Parent アイコン をクリックします。これにより Autoconnect が有効になります。図 1 を参照してください。
  3. [Pallete] パネルで [Text] をクリックして [TextView] をレイアウトにドラッグし、レイアウトの上部近くの中央付近にドロップして、表示される縦線にスナップします。Autoconnect により、ビューを水平方向の中央に配置する左右の制約が追加されます。
  4. テキストビューの上部からレイアウトの上部に対して制約をもう 1 つ適用します。これにより図 1 のように表示されます。

オプションで、[Attributes] ウィンドウの [Common Attributes] パネルで [textAppearance] を展開する場合は、テキスト スタイルを調整し、[textSize] や [textColor] などの属性を変更できます。

メッセージを表示する

この手順では、1 つ目のアクティビティから渡されたメッセージを表示するように、2 つ目のアクティビティを修正します。

  1. DisplayMessageActivity で、次のコードを 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. Alt+Enter(Mac の場合は Option+Return)を押して、他の必要なクラスをインポートします。

    Kotlin

        import androidx.appcompat.app.AppCompatActivity
        import android.content.Intent
        import android.os.Bundle
        import android.widget.TextView
        

    Java

        import androidx.appcompat.app.AppCompatActivity;
        import android.content.Intent;
        import android.os.Bundle;
        import android.widget.TextView;
        

上方向へのナビゲーションを追加する

アプリのメインのエントリ ポイントではない各画面、つまりホーム画面ではないすべての画面に、アプリ階層の論理的な親画面にユーザーを誘導するナビゲーションが必要です。これを行うには、アプリバー上方向ボタンを追加します。

上方向ボタンを追加するには、AndroidManifest.xml ファイルで論理的な親になるアクティビティを宣言する必要があります。app > Manifests > AndroidManifest.xml ファイルを開いて DisplayMessageActivity<activity> タグを見つけ、次のコードに置き換えます。

    <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>
    

これで、上方向ボタンが、Android システムによってアプリバーに自動的に追加されます。

アプリを実行する

ツールバーの Apply Changes アイコン をクリックして、アプリを実行します。アプリが開いたら、テキスト フィールドにメッセージを入力して [Send] をタップすると、2 つ目のアクティビティにメッセージが表示されます。

アプリが開き、左側の画面に入力したテキストが右側に表示されます。
図 2. アプリが開き、左側の画面に入力したテキストが右側に表示されます。

これで最初の Android アプリが完成しました。

Android アプリ開発の基本を引き続き学習するには、初めてのアプリを作成するに戻り、表示されている他のリンクをご覧ください。