Interface

規格にあわせたプログラミング

先ほどの描画の中で、

  • void onDraw(Canvas canvas)
  • boolean onTouchEvent(MotionEvent e)

というメソッドを作成しました。 その際、@Override と修飾されていたのは、親クラス(ここではandroidx.appcompat.app.AppCompatActivity)のメソッドを再定義するよっていう意味です。

これらのメソッドですが、皆さんが「再定義」するんですが、 メソッドを呼び出すのは「システム」側になります。

システムが、皆さんが作成したメソッドを呼び出すには、 あらかじめメソッド名や引数や返り値の型が「合って」いないといけません。

型階層とか interaface は、事前に「メソッド名や引数型や用途など」を決めておき、

  • 定義する側(皆さん):規格に合わせてプログラムを作成
  • 呼び出し側(システム):規格にそってメソッドを呼び出すことで、皆さんの作成したメソッドを呼び出せる。

ってなるわけです。

onClick イベントの処理

一方で、ボタンが押された時の処理などは、

  • void reset(View view)
  • void undo(View view)

などのメソッドを作成します。

実際に、リセットボタンやUndoボタンとの紐づけは、 activity_main.xml などのデザイン画面において、各ボタンの onClick 属性において上記メソッドを選択します。

メソッドの中は例えばこんな感じ。

  1. findViewById() で操作したいGUI部品への参照を取得して、
  2. 前回紹介した自作の reset() メソッドを呼び出し、
  3. そのあと、reset がおこなわれた旨表示するための message() メソッドを呼び出し
public void reset(View view) {
    CustomView v = findViewById(R.id.customView);
    v.reset();
    message("reset");
}

あと注意してほしいのは、これらのメソッドの引数の型が View になっていることです。 ここで View view は、onClick メソッドを紐づけたGUI部品(リセットボタンなど)を さします。実際、view.getId()R.id.buttonReset などを比較すると一致します。

なので、例えば複数のボタンに同じ Event Handler を割り当てたとしても、 view に応じて場合分けすれば、処理内容を変えることはできます。 今回は、リセットボタンやUndoボタンなので、メソッドを別に準備するのが自然だと思います。 でも、例えば電卓プログラムなどを作成する場合は、 数字ごとにメソッドを作成するより、1つのメソッドに処理を記述して、 ボタンに応じて入力値だけを切り替えたほうが自然かもしれません。

Read more