イベント発生時の処理
アプリ上で、ボタンが押された・長押しされた・フォーカスされた等
ユーザによって起こされるアクションをイベントと呼ぶ
イベント発生時には、イベントリスナー(そのイベントに対応したアクションを記述したメソッドが用意されたクラス)がMainActivity.java上で
用意されているかを見て、無ければ何も動作せず、あればメソッドを実行するかたちでアクションを起こす
・イベントリスナーの生成
//MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//----------ボタンクリック時のイベントリスナー-----------
Button btn = findViewById(R.id.btnCurrent);
//対象となるボタンを特定(ここでは画面上に配置されたid:btnCurrentのボタン)
btn.setOnClickListener(
//ボタンに対してクリックリスナーをセット(普通のカッコなの注意)
new View.OnClickListener() {
//View.OnClickListenerインタフェースを実装した
//匿名クラス(名無し)の宣言
@Override
public void onClick(View view) {
//btn.OnClickイベントに対するアクションのonClickメソッド
TextView txt = findViewById(R.id.txtResult);
txt.setText(new Date().toString());
}
}
);
//------------------------------------------------
}
}
ボタンを押したらあるアクションをさせるには
1.ボタンのIDを指定して対象のボタンを取得 (findViewById)
2.ボタンクリック時のイベントリスナーを設定 (setOnClickListener)
2’.View.OnClickListenerインタフェースを継承した匿名クラスにて
onClickメソッドを定義する
2''.onClickメソッド内にアクションの内容を記述する
ラムダ式での記述
Java8からメソッドを1つしかもたないインターフェイスを継承した場合
ラムダ式という省略された記述方法が可能になっている
上記ボタンクリックイベントをラムダ式で記述してみると
Button btn = findViewById(R.id.btnCurrent);
btn.setOnClickListener(view -> {
TextView txt = findViewById(R.id.txtResult);
txt.setText(new Date().toString());
}
);
と、匿名クラスの宣言をすっとばし、その1つのメソッドonClickの引数であるViewクラスのviewに対して直接的に記述できるような形になる
端末の回転時の処理
端末の回転による、画面の回転もイベントの1つであるが
この時なにも設定していないと、回転前の画面が破棄されて
回転後に改めて再作成されて表示される
そのような動作をさせない(回転後も同じ画面を表示させる)為には
//MainActivity.java
//画面が破棄される時(onSaveInstanceState)に現在の画面状態を保存
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
TextView txtResult = findViewById(R.id.txtResult);
outState.putString("txtResult", txtResult.getText().toString());
}
//画面が復元される時(onRestoreInstanceState)に保存状態を取り出し
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
TextView txtResult = findViewById(R.id.txtResult);
txtResult.setText(savedInstanceState.getString("txtResult"));
}
上記のような処理をMainActivity.java内に記述しておく必要がある