カウントダウン
タイマーを使用してカウントダウンをします。
メッセージ用のラベルとしてTextViewを使用しています。
また数字入力としてEditTextを使用しています。
ボタンを準備して実行するとカウントダウンが始まります。
カウントダウンが終わったら終了メッセージを表示させています。
import android.graphics.Color;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
//相対的レイアウト(RelativeLayout)を使用する宣言
import android.view.View;
//クリックイベント用に追加
import android.view.View.OnClickListener;
//ボタンを宣言
import android.widget.Button;
//ログ出力の宣言
import android.util.Log;
//タイマーのための宣言
import java.util.Timer;
import java.util.TimerTask;
//正規表現を使用するための宣言
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.os.Handler;
public class MainActivity extends AppCompatActivity implements OnClickListener {
private int mNo1=0;//TextView
private int mNo2=0;//EditText
private int mNo3=0;//Button
private int mCount=0;
private Timer mTimer;
private clsTimerTask objTimer;
private Handler mHandler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//相対座標を設定できるようにレイアウトを設定
RelativeLayout layout = new RelativeLayout(this);
setContentView(layout);
//Idを取得する
mNo1 = View.generateViewId();
mNo2 = View.generateViewId();
mNo3 = View.generateViewId();
//座標の初期設定
int x = 0;
int y = 0;
int width = 0;
int height = 0;
x = 50;
y = 50;
width = 400;
height = 60;
RelativeLayout.LayoutParams obj = getLayoutObject(width, height);
obj.leftMargin=x;
obj.topMargin=y;
TextView txt1 = new TextView(this);
txt1.setId(mNo1);
txt1.setText("");
txt1.setTextSize(16.0f);
txt1.setBackgroundColor(Color.argb(70, 208, 208, 255));
txt1.setTextColor(Color.BLACK);
txt1.setEnabled(false);//読み取り専用とします
layout.addView(txt1, obj);
y += height + 10;
width = 200;
obj = getLayoutObject(width, height);
obj.leftMargin=x;
obj.topMargin=y;
EditText txt2 = new EditText(this);
txt2.setId(mNo2);
txt2.setText("");
txt2.setTextSize(16.0f);
txt2.setBackgroundColor(Color.argb(70, 208, 208, 255));
txt2.setTextColor(Color.BLACK);
txt2.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);//右寄せ
layout.addView(txt2, obj);
x += width + 10;
obj = getLayoutObject(width, height);
obj.leftMargin=x;
obj.topMargin=y;
Button btn=new Button(this);
btn.setId(mNo3);
//setOnClickListenerはimplements OnClickListenerが必要です
btn.setOnClickListener(this);
btn.setBackgroundColor(Color.GRAY);
btn.setTag(2);
btn.setText("カウントダウン");
layout.addView(btn, obj);
}
@Override
//ボタンがクリックされたら実行されます。
public void onClick(View view) {
int iId=0;
iId=view.getId();
Log.d("view.getId()",String.valueOf(iId));
if(iId==mNo3)
{
String sData="";
TextView txt1=(TextView)findViewById(mNo1);
EditText txt2=(EditText)findViewById(mNo2);
sData=txt2.getText().toString();
if(isNumeric(sData) > 0)
{
txt1.setText("数字を入力してください。");
return;
}
//回数をカウントする
mCount=Integer.parseInt(sData);
if(mCount < 1)
{
txt1.setText("1以上の数字を入力してください。");
return;
}
txt1.setText("残り秒数 : " + String.valueOf(mCount));
//開始
mTimer=new Timer();
objTimer=new clsTimerTask();
mTimer.schedule(objTimer,0,1000);
}
}
//数字チェック用
private int isNumeric(String sData)
{
if(sData.length()<1)return 1;
int result=0;
String regex ="^[0-9]+$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(sData);
if(matcher.find() == false) result = 1;
return result;
}
//このサンプルでは、こっちは使用していません
private int IsNumeric(String sData)
{
if(sData.length() < 1)return 1;
try
{
int result = Integer.parseInt(sData);
}
catch (NumberFormatException e)
{
return 1;
}
return 0;
}
//レイアウトを決定するオブジェクトを生成し渡します
private RelativeLayout.LayoutParams getLayoutObject(int width,int height)
{
return new RelativeLayout.LayoutParams(width, height);
}
class clsTimerTask extends TimerTask
{
@Override
public void run()
{
mHandler.post(new Runnable()
{
public void run()
{
mCount--;
TextView txt=(TextView)findViewById(mNo1);
txt.setText("残り秒数 : " + String.valueOf(mCount));
if(mCount<1)
{
txt.setText("終了しました。");
//停止
mTimer.cancel();
}
}
});
}
}
}
|
ボタンがクリックされた時点でチェック処理をしています。
数字のチェックが問題なければタイマーを実行させています。
数字チェックとして正規表現を使用しています。
(例)
String regex ="^[0-9]+$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(sData);
if(matcher.find() == false) result = 1;
タイマーの実行制御ではカウントを減らしています。
カウント変数が1よりも少ない、すなわち0になったら
処理を終了させています。
(例)
mCount--;
TextView txt=(TextView)findViewById(mNo1);
txt.setText("残り秒数 : " + String.valueOf(mCount));
if(mCount<1)
{
txt.setText("終了しました。");
//停止
mTimer.cancel();
}
|
|