RadioGroup,TextWatcher。今回は少し例外処理を入れる。
Q1
整数を2つ入力し、+、ー、*、/、%を選択すると演算結果を出力するアプリを作成せよ。
詳しくは実行例を参照のこと
[実行例]
スタート画面

二つの数値を入れ、演算子を選ぶと結果が出力される。

不正な値が入っている時や0での割り算が行われた場合にはエラーメッセージを表示する。
(値が入っていない)

(0で割った)

●activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.mjpurin.calcapp.MainActivity">
<EditText
android:id="@+id/etA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="26dp"
android:ems="4"
android:inputType="numberSigned"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/textView1"
android:layout_marginStart="11dp" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/etA"
android:layout_alignBottom="@+id/etA"
android:layout_alignParentStart="true"
android:layout_marginStart="31dp"
android:text="整数A"
android:textSize="18sp" />
<EditText
android:id="@+id/etB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="4"
android:inputType="numberSigned"
android:layout_alignBaseline="@+id/etA"
android:layout_alignBottom="@+id/etA"
android:layout_alignParentEnd="true"
android:layout_marginEnd="47dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="整数B"
android:textSize="18sp"
android:layout_alignBaseline="@+id/etA"
android:layout_alignBottom="@+id/etA"
android:layout_toEndOf="@+id/etA"
android:layout_marginStart="20dp"/>
<RadioGroup
android:id="@+id/rg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/etA"
android:layout_centerHorizontal="true"
android:layout_marginTop="34dp"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:layout_weight="1"
android:text="+"
android:textSize="30sp" />
<RadioButton
android:id="@+id/rb2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:layout_weight="1"
android:text="-"
android:textSize="30sp" />
<RadioButton
android:id="@+id/rb3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:layout_weight="1"
android:text="*"
android:textSize="30sp" />
<RadioButton
android:id="@+id/rb4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:layout_weight="1"
android:text="/"
android:textSize="30sp" />
<RadioButton
android:id="@+id/rb5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="%"
android:textSize="30sp"/>
</RadioGroup>
<TextView
android:id="@+id/tvResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/rg"
android:layout_centerHorizontal="true"
android:layout_marginTop="53dp"
android:textSize="24sp" />
</RelativeLayout>
●MainActivity.java
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements TextWatcher{
private EditText etA, etB;
private RadioGroup rg;
private TextView tvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etA = (EditText) findViewById(R.id.etA);
etB = (EditText) findViewById(R.id.etB);
rg = (RadioGroup) findViewById(R.id.rg);
tvResult = (TextView) findViewById(R.id.tvResult);
etA.addTextChangedListener(this);
etB.addTextChangedListener(this);
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//clearCheckされた場合checkedIdには-1が入る
if(checkedId == -1){
return;
}
String str = "";
try {
int a = Integer.parseInt(etA.getText().toString());
int b = Integer.parseInt(etB.getText().toString());
switch (checkedId) {
case R.id.rb1:
str = String.format("%d+%d=%d", a, b, a + b);
break;
case R.id.rb2:
str = String.format("%d-%d=%d", a, b, a - b);
break;
case R.id.rb3:
str = String.format("%d*%d=%d", a, b, a * b);
break;
case R.id.rb4:
str = String.format("%d/%d=%d", a, b, a / b);
break;
case R.id.rb5:
str = String.format("%d%%%d=%d", a, b, a % b);
break;
}
} catch (NumberFormatException e) {
str = "入力値が整数ではありません!";
} catch (ArithmeticException e) {
str = "0で割ることはできません!";
}
tvResult.setText(str);
}
});
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
rg.clearCheck();
tvResult.setText("");
}
}
コメント