プリント
4つめのパターンでやる
4.onClick プロパティで指定したメソッドを作る
package com.example.lesson4;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity{
private TextView myText;
private Button myButton1;
private Button myButton2;
private Button myButton3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myText = findViewById(R.id.myText);/*newする必要はなくひもづけだけする*/
myButton1 = findViewById(R.id.button);
myButton2 = findViewById(R.id.button2);
myButton3 = findViewById(R.id.button3);
/*
myButton1.setOnClickListener(this);
myButton2.setOnClickListener(this);
*/
}
public void myClick(View v) {
myText.setText("aaaaaaa");
}
/*
@Override
public void onClick(View v) {
if (v != null) {
switch (v.getId()) {
case R.id.button:
//処理
myText.setText("bye wolrd");
break;
case R.id.button2:
//処理
myText.setText("hello wolrd");
break;
default:
break;
}
}
}
*/
}
時間処理
.javaを選んでる状態で
ファイル
→新規
→新規アクティビティ
>II. 時間処理
1)アクティビティの追加
ファイル → 新規 → アクティビティ → 空のアクティビティ
Activity 名:TimeActivity
レイアウト:activity_time(規定のまま)
※確認
・作成されたクラスファイル、レイアウトファイル
・マニフェスト内容
2)起動アクティビティを TimeActivity に変更
3)レイアウトの変更、コントロールの追加
① LinearLayout に変更
② コントロールの追加
種類 id 変数名
TextView nowText nowText
4)TimeActivity の作成
TextView に現在時刻を表示するようにします。
あかいところはalt+enterしてインポートする
候補のどれをインポートするかわかるには経験がいる
TimeActivity.java
package com.example.lesson4;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimeActivity extends AppCompatActivity implements View.OnClickListener {
// 時刻表示のフォーマット定義
private static SimpleDateFormat formatDateTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
private static SimpleDateFormat formatDate = new SimpleDateFormat("yyyy/MM/dd");
private Handler myHandler;
private Timer myTimer;
private Date today;
private TextView nowText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_time);
myHandler = new Handler(getMainLooper());
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
myHandler.post(new Runnable() {
public void run() {
Calendar calendar = Calendar.getInstance();
// 時刻表示
((TextView) findViewById(R.id.nowText)).setText(formatDateTime.format(calendar.getTime()));
}
});
}
}, 0, 1000);
nowText = findViewById(R.id.nowText);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (myTimer != null) {
myTimer.cancel();
myTimer = null;
}
}
@Override
public void onClick(View v) {
if (v != null) {
switch (v.getId()) {
default:
break;
}
}
}
}
これはマルチスレッドのプログラム
timeactivity(たいむあくてぃびてぃ)と
mytimer(まいたいまー)の
2つが動いている
1000ミリ秒ごとにフォーマット整えて表示している
メインアクティビティは、ふつうメインアクティビティを閉じたときにおなくなりになるけど
このプログラムでは必要があってここで手動でおなくなりにしている
protected void onDestroy() {
super.onDestroy();
if (myTimer != null) {
myTimer.cancel();
myTimer = null;
ルールとして
サブのスレッドから
メインのコントロールには直接触れないというルールがある
なのでpostという依頼をする
サブからメインのコントロール
メインスレッド:テキストボックスを表示
サブ:やりたい処理を投函しておく(post)
メインのタイミングのいいときに更新する
このあたりの部分のおはなしらしい
myTimer.schedule(new TimerTask() {
@Override
public void run() {
myHandler.post(new Runnable() {
public void run() {
Calendar calendar = Calendar.getInstance();
// 時刻表示
((TextView) findViewById(R.id.nowText)).setText(formatDateTime.format(calendar.getTime()));
}
});
}
このpostがないと(ダイレクトにやると)起動してもすぐおちて、あんたのところからメインのところにはさわれませんよとエラーがでる
サブからポストして、メインさんの都合のいいタイミングで実行していただくというかたち
あと何日プログラムに修正しますよ