質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

397閲覧

AndoidStudioで電卓アプリ開発 次のボタンの入力が来るまで待つ

takatoshi0915

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2023/05/03 12:31

実現したいこと

ここに実現したいことを箇条書きで書いてください。
電卓アプリで演算子をボタン入力時
表示を削除し元の数値を保持新しい数値をもらった時に
計算を行うようにしたい。

前提

ここに質問の内容を詳しく書いてください。
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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2023/05/03 14:45 編集

まず、質問のコードはコードのマークダウン(```だけの行で囲む)を用いるようにしてください。 おそらく勘違いしていると思いますが、 AdditionButtonClick メソッド全体で + ボタンを押した時の処理です。 メソッド内で // 数字ボタン用のリスナーを用意 View.OnClickListener operationButtonClick = new View.OnClickListener() { といったことを書いたからといってそこで止まってボタンが押されるのを待つわけではありません。 android のプログラムの構造として、「ボタンが押されるのを(システムが)待つ」←→「アプリのコードが処理をする」の交互の繰り返しの形にしなければなりません。
takatoshi0915

2023/05/05 09:03

コメントいただきありがとうございます。試行錯誤でアプリを作成することができました。
jimbe

2023/05/05 12:25

解決しましたら、どのように解決したのかを回答として書いて、ベストアンサーとしてください。 質問をした後に自己解決してしまった https://teratail.com/help#resolve-myself
guest

回答1

0

ボタンが押されるのを待つのはシステムの仕事です。
アプリは「ボタンが押されたら何をするか」をボタンのリスナとして登録するだけで、システムはボタンが押されたらそのリスナを実行し、リスナが終了したらまたボタンが押されるのを待ってくれます。
このような構造のため、いつどのボタンが押されるかはアプリ側で分からず、どのような順で押されても適切な処理が行われるように作る必要があります。

java

1import androidx.annotation.IdRes; 2import androidx.appcompat.app.AppCompatActivity; 3 4import android.os.Bundle; 5import android.view.View; 6import android.widget.Button; 7import android.widget.TextView; 8 9public class MainActivity extends AppCompatActivity { 10 //ナンバーボタンの id 11 private static final @IdRes int[] NUMBUTTON_IDS = { 12 R.id.Zero, R.id.One, R.id.Two, R.id.Three, R.id.Four, 13 R.id.Five, R.id.Six, R.id.Seven, R.id.Eight, R.id.Nine, 14 R.id.Comma 15 }; 16 17 private double calculationResult = 0; //現在の結果 18 private boolean preClear = true; //true なら,数値を表示する前にディスプレイをクリアする. 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.activity_main); 24 25 TextView display = findViewById(R.id.display); 26 27 //ナンバーボタンのリスナ 28 View.OnClickListener numButtonListener = new View.OnClickListener() { 29 @Override 30 public void onClick(View v) { 31 if(preClear) { 32 display.setText(""); 33 preClear = false; 34 } 35 display.setText(display.getText().toString() + ((Button)v).getText().toString()); 36 } 37 }; 38 39 //ナンバーボタン 40 for(@IdRes int id : NUMBUTTON_IDS) { //同じ処理なら ID を配列化してループさせるほうが簡単 41 Button numButton = findViewById(id); 42 numButton.setOnClickListener(numButtonListener); 43 } 44 45 //クリアボタン 46 Button clearButton = findViewById(R.id.Clear); 47 clearButton.setOnClickListener(new View.OnClickListener() { //ボタン毎に処理が違うなら個々に定義したほうが簡単(個別に通知されるモノを1つで受けてまた場合分けする意味は無い) 48 @Override 49 public void onClick(View v) { 50 display.setText(""); 51 } 52 }); 53 //clearButton.setOnClickListener(v -> display.setText("")); //lamda 式を使えればこれだけで済む 54 55 //加算ボタン 56 Button addition = findViewById(R.id.Addition); 57 addition.setOnClickListener(new View.OnClickListener() { 58 @Override 59 public void onClick(View v) { 60 calculationResult += Double.parseDouble(display.getText().toString()); //小数点が有っても無くても数値化出来る 61 display.setText(Double.toString(calculationResult)); 62 preClear = true; //次にナンバーボタンを押した時はディスプレイをクリアしてからとする 63 } 64 }); 65 } 66}

投稿2023/05/07 05:17

jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問