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

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

ただいまの
回答率

88.10%

【Androidアプリ】メソッド内使用変数を別メソッドで使用

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,384

score 42

アプリ開発初心者です。

現在私は、様々なサイトを参考にしながら計算問題アプリを
作成しているのですが、下記コードのpublic void onCreate内で作成したn,mをpublic void showAlert内で使用したいのですが、上手くいきません。

アラートダイアログでは、n,m,totalを表示させているのですが、表示される値が0になっています。

何処を編集したらいいでしょうか?
何か解決策やヒントを教えてください。

また、別途改善した方がいい箇所などがありましたら
ご指摘いただけると幸いです。

回答よろしくお願いします。


        import java.util.ArrayList;
        import java.util.Random;

        import android.app.Activity;
        import android.app.AlertDialog;
        import android.content.DialogInterface;
        import android.content.DialogInterface.OnClickListener;
        import android.graphics.Color;
        import android.os.Bundle;
        import android.view.View;
        import android.view.Window;
        import android.widget.Button;
        import android.widget.TextView;

public class Keisan extends Activity implements View.OnClickListener {

    /**
     * Buttonの配列
     */
    Button mButton[];

    /**
     * Idの配列
     */
    int mId[] = {R.id.btn0, R.id.btn1, R.id.btn2, R.id.btn3,
            R.id.btn4, R.id.btn5, R.id.btn6, R.id.btn7,
            R.id.btn8, R.id.btn9, R.id.purasu, R.id.minus,
            R.id.equal, R.id.ten, R.id.clearbtn};

    /**
     * キー
     */
    private final int KEY_PLUS = 10;
    private final int KEY_MINUS = 11;
    private final int KEY_EQUAL = 12;
    private final int KEY_TEN = 13;
    private final int KEY_CLEAR = 14;
    /**
     * TextView
     */
    private TextView mTextView;
    private TextView mAnswer;

    private TextView qa1;
    private TextView qa2;

    private int n;
    private int m;

    /**
     * 答えのリスト
     */
    private String[] answers = new String[4];
    /**
     * 前の処理
     */
    private int beforeStatus = 0;

    /**
     * 計算中の値
     */
    private ArrayList<String> calcArray;
    /**
     * 計算する時の配列
     */
    private ArrayList<String> signArray;

    AlertDialog  mAlertDlg;


    /**
     * Called when the activity is first created.
     */
    @Override
    **public void onCreate(Bundle savedInstanceState) {**
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.prac);


        Random r = new Random();
        int n = r.nextInt(9) + 1;

        Random t = new Random();
        int m = r.nextInt(9) + 1;


            qa1 = (TextView) findViewById(R.id.text1);
            qa2 = (TextView) findViewById(R.id.text2);

            qa1.setText(String.valueOf(n));
            qa2.setText(String.valueOf(m));




    // 1. AlertDialog.Builder クラスのインスタンスを生成
    AlertDialog.Builder builder = new AlertDialog.Builder(this);////


    // 表示用TextView
    mTextView=(TextView)

    findViewById(R.id.text3);

    mAnswer=(TextView)

    findViewById(R.id.text4);
    // Button
    mButton=new Button[mId.length];

    // Buttonの取り込みとイベントのはりつけ
    for(
    int i = 0;
    i<mId.length;i++)

    {
        // buttonを取り込む
        mButton[i] = (Button) findViewById(mId[i]);
        // buttonのイベント処理
        mButton[i].setOnClickListener(this);
    }

    calcArray=new ArrayList<String>();
    signArray=new ArrayList<String>();
}

    @Override
    public void onClick(View view) {

        // 押されたボタンがどのボタンかを判定
        for (int i = 0; i < mId.length; i++) {
            if (view.equals(mButton[i])) {
                String nowValue = mTextView.getText().toString();
                // CLEAR
                if (i == KEY_CLEAR) {
                    mTextView.setText("");
                    calcArray.clear();
                    signArray.clear();
                    beforeStatus = KEY_CLEAR;
                }
                // =
                else if (i == KEY_EQUAL && nowValue.length() > 0) {
                    nowValue = checkDisplay(nowValue);
                    calcArray.add(nowValue);
                    double ans = calc();
                    //テキストの文字を隠す
                    mTextView.setTextColor(Color.parseColor("white"));
                    showAlert(ans);
                    mTextView.setText(Double.toString(ans));
                    calcArray.clear();
                    signArray.clear();
                    beforeStatus = i;
                }

                   else if (i < 10) {
                    nowValue = checkDisplay(nowValue);
                    // 0しか入力されていない場合は0が2個以上並ばないようにする
                    if (nowValue.equals("0") && i == 0) {
                        return;
                    } else if (nowValue.equals("0") && i != 0) {
                        nowValue = "";
                    }

                    nowValue = nowValue + i;
                    mTextView.setText(nowValue);
                    beforeStatus = i;
                }
                break;
            }
        }
    }

    //演算が行われていた場合を確認する
    //遅れた状態でディスプレイの値を初期化する
    private String checkDisplay(String now) {
        if (beforeStatus == KEY_PLUS
                || beforeStatus == KEY_MINUS
                || beforeStatus == KEY_EQUAL) {
            mTextView.setText("");
            return "0";
        }
        return now;
    }

    // 計算する
    private double calc() {
        if (calcArray.size() == 0) {
            return 0.0;
        }
        if (calcArray.size() == 1) {
            return Double.parseDouble(calcArray.get(0));
        }
        double passive = Double.parseDouble(calcArray.get(0));
        double active;
        int j = 0;
        for (int i = 1; i < calcArray.size(); i++) {
            active = Double.parseDouble(calcArray.get(i));
            if (signArray.get(j).equals("+")) {
                passive += active;
            } else {
                passive -= active;
            }
            j++;
        }
        return passive;


    }


 ** private void showAlert(double ans) {**


       int total = 0;
       total += n;
       total += m;


        String title = getString(R.string.title);

        //インスタンス作成
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(title);
       ** builder.setMessage(String.format(getString(R.string.msg), n, m, total));**
        builder.create().show();




        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {

            }
        });


                }


    //回答一覧を管理するリスナー
    private class MyDialogListener implements OnClickListener {


        public void onClick(DialogInterface dialog, int which) {
            //回答判定
            if (mTextView.getText().toString().equals(answers[which])) {
                mAnswer.setTextSize(100.0f);
                mAnswer.setText("○");
                mAnswer.setTextColor(Color.RED);
            } else {
                mAnswer.setTextSize(130.0f);
                mAnswer.setText("×");
                mAnswer.setTextColor(Color.BLUE);
            }


            //正解を表示
            mTextView.setTextColor(Color.parseColor("#F39800"));


        }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

フィールド変数にn,mがありますが,onCreateでもn,mを宣言しており,乱数の結果はこのローカル変数の方に入っています.
n,mへの代入の際にintを外せばフィールド変数への代入になり,他のメソッドでの計算ができます.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

そもそもこのコードが実行できるか疑問ですが。

メソッド内で宣言した変数はそのメソッド内でしか使えません。
nとmとtotalをフィールド変数として宣言すれば使えます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る