sholler's プログラムとメモ帳

日々プログラムをしていて出てきたエラーの処理、技術関連の気になった記事などを題材に書いていくブログ。

【Android】電卓を作る3

今回はbuttonMethodの処理を書いていく
前回の続きから記述する

まずは状態分岐を作る。
状態は前回の表の通り
「A入力中」「演算子入力中」「B入力中」「表示中」の4つ

public void buttonMethod(View b) {
	// 入力値取得
	Button button = (Button)b;
	String s = button.getText().toString();
	// テキストビュー取得
	TextView text = (TextView)findViewById(R.id.answerView);

	// ■■■■■■■■■■■■■■■■■■■■■ 状態分岐 ■■■■■■■■■■■■■■■■■■■■■
	// A入力中
	if(state == 0){
		
	}
	
	// 演算子入力中
	else if(state == 1){
	
	}
	
	// B入力中
	else if(state == 2){

	}
	
	// 表示中
	else if(state == 3){
		
	}
}


状態分岐の中でさらに、イベント分岐をする。
イベントは前回作ったchkEvent()関数でチェックする。
「0: 0〜9」「1: 演算子」「2: =」「3: C」「4: AC」

状態「A入力中」のイベント分岐

public void buttonMethod(View b) {
	// ■■■■■■■■■■■■■■■■■■■■■ 状態分岐 ■■■■■■■■■■■■■■■■■■■■■
	// A入力中
	if(state == 0){

		// ■■■■■■ イベント分岐 ■■■■■■ 
		// 数値
		if(chkEvent(s) == 0){
			
		}
		// 演算子
		else if(chkEvent(s) == 1){
			
		}
		// =
		else if(chkEvent(s) == 2){
			
		}
		// C
		else if(chkEvent(s) == 3){
			
		}
		// AC
		else if(chkEvent(s) == 4){
			
		}

	}


あとは、前回の表を見ながら処理を記述していく。
inputStrに値が入っていないとエラーが出る処理は
length()関数を使って、値の有無をチェックして処理を通すようにする。

// ■■■■■■ イベント分岐 ■■■■■■ 
// 数値
if(chkEvent(s) == 0){
	inputStr += s;
	text.setText(inputStr);
	state = 0;
}
// 演算子
else if(chkEvent(s) == 1){
	if(inputStr.length() != 0){
		aNum = inputStr;
		text.setText(aNum);
		op = s;
		state = 1;
	}
}
// =
else if(chkEvent(s) == 2){
	if(inputStr.length() == 0){
		text.setText("0");
	}else{
		text.setText(inputStr);
	}
	state = 3;
}
// C
else if(chkEvent(s) == 3){
	aNum = "";
	inputStr = "";
	text.setText("0");
	state = 0;
}
// AC
else if(chkEvent(s) == 4){
	aNum = "";
	bNum = "";
	inputStr = "";
	text.setText("0");
	state = 0;
}


別の状態でも同じように実装していった。
以下buttonMethod内の全ソース

public void buttonMethod(View b) {
// 入力値取得
Button button = (Button)b;
String s = button.getText().toString();
// テキストビュー取得
TextView text = (TextView)findViewById(R.id.answerView);

// ■■■■■■■■■■■■■■■■■■■■■ 状態分岐 ■■■■■■■■■■■■■■■■■■■■■
// A入力中
if(state == 0){
	// ■■■■■■ イベント分岐 ■■■■■■ 
	// 数値
	if(chkEvent(s) == 0){
		inputStr += s;
		text.setText(inputStr);
		state = 0;
	}
	// 演算子
	else if(chkEvent(s) == 1){
		if(inputStr.length() != 0){
			aNum = inputStr;
			text.setText(aNum);
			op = s;
			state = 1;
		}
	}
	// =
	else if(chkEvent(s) == 2){
		if(inputStr.length() == 0){
			text.setText("0");
		}else{
			text.setText(inputStr);
		}
		state = 3;
	}
	// C
	else if(chkEvent(s) == 3){
		aNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
	// AC
	else if(chkEvent(s) == 4){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
	
}


// 演算子入力中
else if(state == 1){
	// ■■■■■■ イベント分岐 ■■■■■■ 
	// 数値
	if(chkEvent(s) == 0){
		inputStr = s;
		text.setText(inputStr);
		state = 2;
	}
	// 演算子
	else if(chkEvent(s) == 1){
		op = s;
		state = 1;
	}
	// =
	else if(chkEvent(s) == 2){
		result = calculation(aNum, aNum, op);
		text.setText(result);
		state = 3;
	}
	// C
	else if(chkEvent(s) == 3){
		aNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
	// AC
	else if(chkEvent(s) == 4){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
}


// B入力中
else if(state == 2){
	// ■■■■■■ イベント分岐 ■■■■■■ 
	// 数値
	if(chkEvent(s) == 0){
		inputStr += s;
		text.setText(inputStr);
		state = 2;
	}
	// 演算子
	else if(chkEvent(s) == 1){
		bNum = inputStr;
		result = calculation(aNum, bNum, op);
		text.setText(result);
		aNum = result;
		op = s;
		state = 2;
	}
	// =
	else if(chkEvent(s) == 2){
		bNum = inputStr;
		result = calculation(aNum, bNum, op);
		text.setText(result);
		aNum = result;
		state = 3;
	}
	// C
	else if(chkEvent(s) == 3){
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 2;
	}
	// AC
	else if(chkEvent(s) == 4){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
}


// 表示中
else if(state == 3){
	// ■■■■■■ イベント分岐 ■■■■■■ 
	// 数値
	if(chkEvent(s) == 0){
		inputStr = s;
		text.setText(inputStr);
		state = 0;
	}
	// 演算子
	else if(chkEvent(s) == 1){
		aNum = result;
		op = s;
		state = 1;
	}
	// =
	else if(chkEvent(s) == 2){
		if(aNum.length() == 0 || bNum.length() == 0){
			text.setText("0");
		}else{
			result = calculation(aNum, bNum, op);
			text.setText(result);
			aNum = result;
		}
		state = 3;
	}
	// C
	else if(chkEvent(s) == 3){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
	// AC
	else if(chkEvent(s) == 4){
		aNum = "";
		bNum = "";
		inputStr = "";
		text.setText("0");
		state = 0;
	}
}

これで電卓として機能はするようになったけど、
同じようなイベント分岐が全部に書いてあるのがとてもナンセンス。
もっと関数化とかしてソースを短く済ませたいので、思いついたら関数化して
もっと読みやすいコードにしたい。

あと、この状態だと「+/-」ボタンと「BS」ボタンが
効かないので、次回にでも付け加えたい。

電卓のデザインも少し変えてみた。
色と形だけ
f:id:sholler:20131229233746p:plain


ボタンのマージンの設定で少し、戸惑ったのでこれもメモ。
横のプロパティの中をよく探してみるとあった
f:id:sholler:20131229233905p:plain