実現したいこと
ここに実現したいことを箇条書きで書いてください。
電卓アプリで演算子をボタン入力時
表示を削除し元の数値を保持新しい数値をもらった時に
計算を行うようにしたい。
前提
ここに質問の内容を詳しく書いてください。
AndroidStudioをjavaで電卓アプリを作成中
現状各数字ボタンの設定、AC等を作ったが
肝心の演算子+ボタンのコードを記載したが
現状コードでは1つ目の数字をディスプレイに表示削除後
二回目の入力を待たずにエラーが発生してしまう。
発生している問題・エラーメッセージ
エラーメッセージ View.access$3100(View.java:778) で android.view.View$PerformClick.run(View.java:25885) で android.os.Handler.handleCallback(Handler.java:873) で android.os.Handler. android.os.Looper.loop(Looper.java:211) での dispatchMessage(Handler.java:99) Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) I/Process: シグナルを送信しています。PID: 8548 SIG: 9 エラー内容 このようなエラーが出た 99) android.os.Looper.loop(Looper.java:211) で android.app.ActivityThread.main(ActivityThread.java:6769) で java.lang.reflect.Method.invoke(Native Method) で com.android .internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) I/プロセス: シグナルを送信しています。PID: 8548 SIG: 9 エラー内容 このようなエラーが出た 99) android.os.Looper.loop(Looper.java:211) で android.app.ActivityThread.main(ActivityThread.java:6769) で java.lang.reflect.Method.invoke(Native Method) で com.android .internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) I/プロセス: シグナルを送信しています。PID: 8548 SIG: 9 エラー内容 このようなエラーが出た
該当のソースコード
javaここに言語名を入力
ソースコード
package com.websarva.wings.android.dentaku;
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 {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // displayを取得。 TextView display = findViewById(R.id.display); // 数字ボタンの取得。 Button zero = findViewById(R.id.Zero); Button one = findViewById(R.id.One); Button two = findViewById(R.id.Two); Button three = findViewById(R.id.Three); Button four = findViewById(R.id.Four); Button five = findViewById(R.id.Five); Button six = findViewById(R.id.Six); Button seven = findViewById(R.id.Seven); Button eight = findViewById(R.id.Eight); Button nine = findViewById(R.id.Nine); Button comma = findViewById(R.id.Comma); // 演算子ボタンを取得。 Button clear = findViewById(R.id.Clear); Button Addition = findViewById(R.id.Addition); // 数字ボタン用のリスナーを用意 View.OnClickListener operationButtonClick = new View.OnClickListener() { @Override public void onClick(View v) { // 触られたボタンのテキストを取得。 String buttonText = ((Button) v).getText().toString(); // 現在のテキストを取得。 String currentString = display.getText().toString(); // 上記二つのテキストを追加する。 String addString = currentString + buttonText; display.setText(addString); } }; // 数字ボタン用のリスナーをボタンに設定。 zero.setOnClickListener(operationButtonClick); one.setOnClickListener(operationButtonClick); two.setOnClickListener(operationButtonClick); three.setOnClickListener(operationButtonClick); four.setOnClickListener(operationButtonClick); five.setOnClickListener(operationButtonClick); six.setOnClickListener(operationButtonClick); seven.setOnClickListener(operationButtonClick); eight.setOnClickListener(operationButtonClick); nine.setOnClickListener(operationButtonClick); comma.setOnClickListener(operationButtonClick); // 演算子ボタンを取得。 clear.setOnClickListener(this::ClearButtonClick); Addition.setOnClickListener(this::AdditionButtonClick); } // ACボタンが押された時のメソッド private void ClearButtonClick(View view) { // displayを取得。 TextView display = findViewById(R.id.display); // 空のも文字列を用意。 String non = ""; display.setText(non); } // +ボタンが押された時のメソッド private void AdditionButtonClick(View view) { // currentNumberとinputNumberフィールドに用意。 double currentNumber = 0.0; double inputNumber = 0.0; // displayを取得。 TextView display = findViewById(R.id.display); // 現在のテキストを取得。 String currentString = display.getText().toString(); // currentStringに「.」が含まれるか判断し含まれる場合 // double型に含まれない場合int型にキャストする。 if (currentString.contains(".")) { // currentStringに「.」が含まれている場合の処理 currentNumber = Double.parseDouble(currentString); } else { // currentStringに「.」が含まれていない場合の処理 currentNumber = Integer.parseInt(currentString); } // 次の数値が入力される前にdisplayをクリアする。 display.setText(""); // 数字ボタン用のリスナーを用意 View.OnClickListener operationButtonClick = new View.OnClickListener() { @Override public void onClick(View v) { // 触られたボタンのテキストを取得。 String buttonText = ((Button) v).getText().toString(); // 現在のテキストを取得。 String currentString = display.getText().toString(); // 上記二つのテキストを追加する。 String addString = currentString + buttonText; display.setText(addString); } }; // 現在のテキストを取得。 String inputString = display.getText().toString(); // inputStringに「.」が含まれるか判断し含まれる場合 // double型に含まれない場合int型にキャストする。 if (currentString.contains(".")) { // currentStringに「.」が含まれている場合の処理 inputNumber = Double.parseDouble(inputString); } else { // currentStringに「.」が含まれていない場合の処理 inputNumber = Integer.parseInt(inputString); } // inputNumberとcurrentNumberを足す。 double calculationResult = currentNumber + inputNumber; String Result = Double.toString(calculationResult); display.setText(Result); }
}
試したこと
どのように対応すればよいかで悩んでいます。
非同期処理が良いのでしょうか?
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
