JavaとKotlinそれぞれでメイン画面から、条件分岐で3つの画面に遷移でき、画面遷移の際に遷移先の画面に値を送ることのできるアプリの作成。
- Androidの基本機能の説明(10分)
- JavaでAndroidアプリの作成(20分)
- KotlinでAndroidアプリの作成(20分)
- 画面(レイアウト)を作成する
- アクティビティクラスを作成する
- AndroidManifest.xmlにアクティビティクラスを追加する
- ボタンのイベントリスナを追加する
遷移先の画面を作成する。レイアウトの作成方法には、プログラムから設定する方法とXMLファイルから設定する方法がある。
「app->res->layout」で右クリックし「new->Layout Resource file」からでもXMLファイルを作成可能。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="learning.kotlin.jp.kronos.javaproject.Activity2">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="画面2"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:textSize="40px"/>
</RelativeLayout>
主なレイアウトの一覧
レイアウト名 | 説明 |
---|---|
RelativeLayout | 他のコンポーネントと相対的な関係でコンポーネントを配置するレイアウト。 |
LinearLayout | レイアウトに配置されたパーツを縦もしくは横一列に並べたい場合に使用するレイアウト。 |
TableLayout | パーツを格子状に配置したい場合に使用します。HTMLのtableタグと同じようにレイアウトを作成することができる。 |
GridLayout | TableLayoutと同じくパーツを格子状に配置したい場合に使用するレイアウト。TableLayoutとの違いは、TableLayoutは縦方向のセルの結合はできないが、GridLayoutでは可能。 |
レイアウトにテキスト表示やボタン表示などのビューを追加していく。今回はレイアウトファイルにボタンを追加します。レイアウトタグ内にButtonタグを追加することで、画面にボタンを配置することができる。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="learning.kotlin.jp.kronos.javaproject.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="メイン画面"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="87dp"
android:textSize="40px"/>
<Button
android:id="@+id/startButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="StartButton"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
主なViewの一覧
View名 | 説明 |
---|---|
TextView | 画面にテキストを表示するためのウィジェット |
EditText | テキストボックスを作成する際に使用するウェジェット |
Button | ボタンを表示するウェジェット。ユーザーがクリックすることで、動作をする。 |
ImageView | 画面に画像を表示するためのウェジェット |
ListView | 画面に表形式で表示するウェジェット |
画面の制御を行うための機能。画面の表示やユーザーインターフェイスとのやり取りの制御を行う。基本的には1つの画面に対し、1つのアクティビティを作成する。
「app->java->"パッケージ名"」で右クリックし「new->Java Class」からJavaファイルを作成する。
public class Activity2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2);
}
}
kotlinで書くと・・・
class Activity2 : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity2)
}
}
アクティビティは、Android SDKで提供されているandroid.app.Activityクラスもしくはそのサブクラスを継承して作成する。アクテビティはアプリケーションが起動されることによりインスタンス化され、様々な状態(ライフサイクル)に変化する。その状態にそれぞれライフサイクルメソッドが用意されている。
Activityクラスのライフサイクルメソッド
メソッド名 | 説明 |
---|---|
onCreate | 該当のアクテビティが作成されたときに呼び出される。表示する画面の設定などを行う。 |
onStart | 該当のアクティビティに設定された画面が表示される直前に呼び出される。 |
onRestart | 停止状態から実行状態になる直前に呼び出される。 |
onResume | ユーザーとのやりとり(入力の受付)を開始する直前に呼び出される |
onPause | 該当のアクティビティに設定された画面が非表示になった時に呼び出される。 |
onStop | 該当のアクティビティに設定された画面が長時間非表示になった時に呼び出される。 |
onDestroy | 該当のアクティビティが破棄された時に呼び出される。 |
onCreateメソッド内でsetContentViewメッソドを使用して、アクティビティに表示するレイアウトの設定を行う。引数にRクラスで定義された定数を使用する。resディレストリに定義された内容は自動的にIDが割り当てられ、Rクラスで管理されている。レイアウトファイルの場合、「R.layout."ファイル名"」で管理されている。
AndroidManifestは、Androidアプリケーションを実行する上で必要となる様々な情報をAndroidプラットフォームへ伝達する役割を持つ。各アプリケーションに必ず一つ必要となるファイルである。その役割の一つがアプリケーションのコンポーネントの宣言である。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="training.kotlin.jp.kronos.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Activity2"/>
</application>
</manifest>
Activityなどのアプリケーションのコンポーネントはapplicationタグのサブ要素に情報を定義する。activityタグのname要素に実装したアクティビティクラスを指定する。
画面上で右クリックから「New -> Activity -> EmptyActivity」を選択し、アクティビティ名・レイアウトファイル名・作成するパッケージ名を指定してアクティビティクラスとレイアウトファイルを作成することで、設定などを自動で行うことができる。
ボタンにイベントリスナーを追加することで、ユーザーのボタン操作を処理することができる。あるイベントに対して行いたい処理がある場合、対象のイベントリスナをアクティビティクラスで実装することで、その処理を実現することができる。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ボタンの取得
Button startButton = (Button)findViewById(R.id.startButton);
//イベントリスナーの定義
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//画面遷移のIntent起動
Intent intent = new Intent(getApplicationContext(),Activity2.class);
startActivity(intent);
}
});
}
}
kotlinで書くと・・・
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val startButton: Button = findViewById(R.id.startButton)
startButton.setOnClickListener {
startActivity(Intent(applicationContext, Activity2::class.java))
}
}
}
画面レイアウトで作成したボタンの情報をプログラム内で取得する。取得する際は、findViewByIdメソッドを使用する。引数にはRクラスのリソースIDを指定、戻り値はView型なので目的の型にキャストする必要があるので、今回はButtonクラスにキャストする。
AndroidSDKにはイベントリスナーを定義するためのインターフェイスが多数用意されており、イベントが発生するとそれらのインターフェイスで宣言されているメソッドが呼び出される。今回はボタンに対するクリック時にイベントが発生するため、OnClickListenerインターフェイスで宣言されているonClickメソッドを使用する。
定義したイベントリスナーは、インスタンス化した上で、イベントの発生元と関連つける必要がある。今回はボタンと関連つける必要がある。関連付けには、各ビューで定義されているsetOnClickListenerメソッドを用いる。引数にはOnClickListenerインターフェイスを実装したオブジェクトを指定する。
Androidアプリケーションで画面の遷移はインテントという仕組みを使用する。インテントは起動したいアクティビティやサービスの基本情報と、引き渡したい情報を保持する。呼び出し元のアプリケーションやアクティビティは「何をどのようにして起動するか」という情報を持ったインテントをAndroidプラットフォームに送り、Androidプラットフォームではその情報を元に該当するアクティビティを起動する。
インテントオブジェクトを、第一引数に遷移元のアクティビティアブジェクトを、第二引数に遷移先のクラスを指定して作成する。その作成したオブジェクトを引数にstartActivityメソッドを呼び出すことで、第二引数で指定したクラスに紐づいた画面に遷移することができる。