別の Activity を開始する

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

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

送信ボタンに応答する

以下の操作を実行して、ボタンによって呼び出されるメソッドを MainActivity.java に追加します。

  1. app > java > com.example.myfirstapp > MainActivity.java ファイルで、sendMessage() メソッドスタブを以下のように追加します。
    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 であること
  • View のみをパラメータとして持つこと(これはクリックされた View オブジェクトです)

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

Intent を作成する

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

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

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)を押します。インポート内容は次のようになります。

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

第 2 の activity を作成する

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

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

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

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

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

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

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

  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 つ目の activity から渡されたメッセージを表示するように、2 つ目の activity を修正します。

  1. DisplayMessageActivity.java で、次のコードを onCreate() メソッドに追加します。
    @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)を押して足りないクラスをインポートします。インポート内容は次のようになります。
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    

Up ナビゲーションを追加する

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

必要なことは、AndroidManifest.xml ファイルで論理的な親になる activity を宣言するだけです。そうするには、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 システムは Up ボタンをアプリバーに自動的に追加します。

アプリを実行する

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

図 2.2 つの activity のスクリーンショット

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

Android アプリ開発に関する基本の学習を続けるには、下記のリンクで次のレッスンをご覧ください。