Skip to content

Latest commit

 

History

History
231 lines (179 loc) · 12 KB

勉強会.md

File metadata and controls

231 lines (179 loc) · 12 KB

Kotlin Android 勉強会

目標 

JavaとKotlinそれぞれでメイン画面から、条件分岐で3つの画面に遷移でき、画面遷移の際に遷移先の画面に値を送ることのできるアプリの作成。

タイムスケジュール

  • Androidの基本機能の説明(10分)
  • JavaでAndroidアプリの作成(20分)
  • KotlinでAndroidアプリの作成(20分)

Androidで画面遷移を行うには

  1. 画面(レイアウト)を作成する
  2. アクティビティクラスを作成する
  3. AndroidManifest.xmlにアクティビティクラスを追加する
  4. ボタンのイベントリスナを追加する

Step1 画面(レイアウト)の作成

遷移先の画面を作成する。レイアウトの作成方法には、プログラムから設定する方法と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 画面に表形式で表示するウェジェット

Step2 アクティビティクラスの作成

Activity

画面の制御を行うための機能。画面の表示やユーザーインターフェイスとのやり取りの制御を行う。基本的には1つの画面に対し、1つのアクティビティを作成する。

Activityクラスの作成

「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."ファイル名"」で管理されている。

Step3 AndroidManifestにActivityクラスを追加する

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」を選択し、アクティビティ名・レイアウトファイル名・作成するパッケージ名を指定してアクティビティクラスとレイアウトファイルを作成することで、設定などを自動で行うことができる。

Step4 ボタンのイベントリスナを追加する

ボタンにイベントリスナーを追加することで、ユーザーのボタン操作を処理することができる。あるイベントに対して行いたい処理がある場合、対象のイベントリスナをアクティビティクラスで実装することで、その処理を実現することができる。

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インターフェイスを実装したオブジェクトを指定する。

Intentを起動する

Androidアプリケーションで画面の遷移はインテントという仕組みを使用する。インテントは起動したいアクティビティやサービスの基本情報と、引き渡したい情報を保持する。呼び出し元のアプリケーションやアクティビティは「何をどのようにして起動するか」という情報を持ったインテントをAndroidプラットフォームに送り、Androidプラットフォームではその情報を元に該当するアクティビティを起動する。
インテントオブジェクトを、第一引数に遷移元のアクティビティアブジェクトを、第二引数に遷移先のクラスを指定して作成する。その作成したオブジェクトを引数にstartActivityメソッドを呼び出すことで、第二引数で指定したクラスに紐づいた画面に遷移することができる。