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

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

注: このレッスンでは、Android Studio 3.0 以降を使用することを想定しています。

[送信] ボタンに応答する

以下の操作を実行して、ボタンによって呼び出されるメソッドを 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 のみをパラメータとして持つ(クリックされた View オブジェクト)

次に、このメソッドをテキスト フィールドのコンテンツを読み込むように設定し、そのテキストを別のアクティビティに送ります。

インテントを作成する

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

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

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

  • Intent コンストラクタには、次の 2 つのパラメータがあります。
    • 1 つ目のパラメータ: ContextActivity クラスが Context のサブクラスであるため this が使用されます)
    • 2 つ目のパラメータ: Intent が送られるアプリ コンポーネントの Class(ここでは開始されるアクティビティ)
  • putExtra() メソッドは EditText の値をインテントに追加します。Intent では、extras というキーと値のペアでデータ型をやり取りします。使用するキーは EXTRA_MESSAGE というパブリック定数で、次のアクティビティでこのキーを使用してテキスト値を取得します。インテントのエクストラのキーを接頭語としてアプリのパッケージ名を付けて定義すると、アプリが他のアプリと連携する場合にキーを一意に識別できるようになります。
  • startActivity() メソッドは、Intent で指定された DisplayMessageActivity のインスタンスを開始します。ここでそのクラスを作成する必要があります。

現在アルファ版の Navigation Architecture Component を使用すると、Navigation Editor を使用してアクティビティ同士を関連付けることができます。関係が作成されたら、関連付けられたアクションをユーザーがトリガーしたときに API を使って第 2 のアクティビティを開始できます。詳しくは、Navigation Architecture Component をご覧ください。

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

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

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

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

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

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

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

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

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

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

[上] ナビゲーションを追加する

アプリのメインのエントリ ポイントではない各画面(「ホーム」画面ではないすべての画面)にナビゲーションを提供して、ユーザーがアプリバーの [上] ボタンをタップしてアプリ階層の論理的な親画面に戻れるようにする必要があります。

具体的には、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] をクリックしてアプリを再度実行します。アプリが開いたら、テキスト フィールドにメッセージを入力して [送信] をタップし、2 つ目のアクティビティにメッセージが表示されることを確認します。

図 2. 2 つのアクティビティのスクリーンショット

これで最初の Android アプリの完成です。

Android アプリ開発に関する基本の学習を続けるには、このチュートリアルのトップページの他のリンクをご覧ください。