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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

1回答

2166閲覧

onClickメソッドのアクセス方法

RunningReo

総合スコア6

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2020/10/18 09:27

現在クイズアプリを作成中です。

イメージ説明
分野ごとにクイズを作成しているのですが、全分野同じソースコードで、問題のみが異なるので、途中からクイズ画面を作成するメソッドOpenQ()とボタンを押したときに正誤判定をするxmlファイルで定義したonClickメソッド(checkAnswer)を他のクラスから参照してきて、コーディングを省略することにしました。

下記のコードでは、ServiceManagementクラスから参照しようとしています。
ServiceManagementクラスをOpenという名前でインスタンス化します。そして、そこからOpenQメソッドを使っています。

ここはまで、良かったのです。

しかし、checkAnswerメソッドの方が上手くいかないのです。

onClickは、ButtonクラスのメソッドなのでButtonで参照しようかと思いましたが、どうもうまくいきません。

何故、上手くいかないのでしょうか?publicで定義しているので、できるはずだと思っていたのですが、ご教授いただければ幸いです。

↓こちらが、参照元のServiceManagementクラスです。

java

1package jp.wings.nikkeibp.quizapp; 2 3import androidx.appcompat.app.AlertDialog; 4import androidx.appcompat.app.AppCompatActivity; 5 6import android.app.Application; 7import android.content.DialogInterface; 8import android.content.Intent; 9import android.os.Bundle; 10import android.view.View; 11import android.widget.Button; 12import android.widget.TextView; 13 14import java.lang.reflect.Array; 15import java.util.ArrayList; 16import java.util.Random; 17 18public class ServiceManagement extends AppCompatActivity { 19 20 private TextView c,q; 21 private Button a1,a2,a3,a4; 22 private int quizCount = 1; 23 private String rightAnswer; 24 private int rightCount = 0,Continuos = 0,Qvolume = 5; 25 26 String quizData[][] = { 27 {"SFAとは","営業支援","自主運用","サーバ借り","絶対必要"}, 28 {"バックエンドとは","見えない所","複数共有","使いやすさ","根本的改良"}, 29 {"フロントエンドとは","見える所","生活改善","情報格差","業務改善"}, 30 {"BPRとは","根本的改良","大量データ","自主運用","見えない所"}, 31 {"RPAとは","業務自動化","情報格差","見えることろ",""}, 32 {"インフラ","絶対必要","使いやすさ","営業支援","ゲーム要素"}, 33 {"ホスティングサービス","サーバ借り","構想具体化","見積書要求","エコな調達"}, 34 }; 35 36 ArrayList<ArrayList<String>> FEquestion = new ArrayList<>(); 37 38 @Override 39 protected void onCreate(Bundle savedInstanceState) { 40 super.onCreate(savedInstanceState); 41 setContentView(R.layout.activity_service_management); 42 43 c = findViewById(R.id.countLabel); 44 q = findViewById(R.id.questionLabel); 45 a1 = findViewById(R.id.answerBtn1); 46 a2 = findViewById(R.id.answerBtn2); 47 a3 = findViewById(R.id.answerBtn3); 48 a4 = findViewById(R.id.answerBtn4); 49 50 for (int i = 0; i < 5; i++) { 51 52 ArrayList<String> tempra = new ArrayList<>(); 53 54 tempra.add(quizData[i][0]); 55 tempra.add(quizData[i][1]); 56 tempra.add(quizData[i][2]); 57 tempra.add(quizData[i][3]); 58 tempra.add(quizData[i][4]); 59 60 FEquestion.add(tempra); 61 } 62 63 OpenQ(); 64 } 65 66 public void OpenQ(){ 67 68 c.setText("Q" + quizCount); 69 70 Random random = new Random(); 71 int randNum = random.nextInt(FEquestion.size()); 72 73 ArrayList<String> quiz = new ArrayList<>(); 74 75 quiz = FEquestion.get(randNum); 76 77 q.setText(quiz.get(0)); 78 79 quiz.remove(0); 80 81 a1.setText(quiz.get(0)); 82 a2.setText(quiz.get(1)); 83 a3.setText(quiz.get(2)); 84 a4.setText(quiz.get(3)); 85 86 FEquestion.remove(randNum); 87 } 88 89 public void checkAnswer(View view){ 90 91 Button answerBtn = findViewById(view.getId()); 92 String answerTxt = answerBtn.getText().toString(); 93 94 String notice; 95 96 if (answerTxt == rightAnswer){ 97 98 notice = "正解!"; 99 rightCount++; 100 Continuos++; 101 102 if (Continuos > 1) { 103 104 notice = Continuos + "連続正解"; 105 } 106 107 }else { 108 109 notice = "不正解"; 110 Continuos = 0; 111 } 112 113 AlertDialog.Builder Notice = new AlertDialog.Builder(this); 114 Notice.setTitle(notice); 115 Notice.setMessage("答え:" + rightAnswer); 116 Notice.setPositiveButton("NEXT", new DialogInterface.OnClickListener() { 117 @Override 118 public void onClick(DialogInterface dialog, int which) { 119 120 if (rightCount == Qvolume){ 121 Intent jorney = new Intent(getApplicationContext(),resultActivity.class); 122 jorney.putExtra("RIGHT_ANSWER_COUNT",rightCount); 123 startActivity(jorney); 124 }else{ 125 quizCount++; 126 OpenQ(); 127 } 128 129 } 130 }); 131 } 132}

そして、こちらが、basicTheoryクラスで、参照しようと試みているコードです。

java

1package jp.wings.nikkeibp.quizapp; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.os.Bundle; 6import android.view.View; 7import android.widget.Button; 8import android.widget.TextView; 9 10import java.util.ArrayList; 11import java.util.Collections; 12import java.util.Random; 13 14public class basicTheory extends AppCompatActivity { 15 16 private TextView c, q; 17 private Button a1, a2, a3, a4; 18 private int rightCount = 0, quizCount = 1, Continuos = 0, Qvolume = 5; 19 private String rightAnswer; 20 21 String quiz[][] = { 22 {"アナログとは", "うにょーん", "", "", ""}, 23 {"デジタルとは", "カクカク", "", "", ""}, 24 {"M(メガ)とは", "10^6", "10^3", "10^9", "10^12"}, 25 {"G(ギガ)とは", "10^9", "10^6", "10^3", "10^12"}, 26 {"μ(マイクロ)とは", "10^-6", "10^-9", "10^-3", "10^-12"}, 27 {"n(ナノ)", "10^-9", "10^-3", "10^-6", "10^-12"}, 28 }; 29 30 ArrayList<ArrayList<String>> FEquestion = new ArrayList<>(); 31 32 @Override 33 protected void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.activity_basic_theory); 36 37 c = findViewById(R.id.countLabel); 38 q = findViewById(R.id.questionLabel); 39 40 for (int i = 0; i < 5; i++) { 41 42 ArrayList<String> tempra = new ArrayList<>(); 43 44 tempra.add(quiz[i][0]); 45 tempra.add(quiz[i][1]); 46 tempra.add(quiz[i][2]); 47 tempra.add(quiz[i][3]); 48 tempra.add(quiz[i][4]); 49 50 FEquestion.add(tempra); 51 } 52 53 ServiceManagement Open = new ServiceManagement(); 54 Open.OpenQ(); 55 56 } 57 Open.checkAnswer();//ここで、Openが赤字になる。 58 59}

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

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

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

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

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

dodox86

2020/10/18 09:46

> ServiceManagement Open = new ServiceManagement(); > Open.OpenQ(); > } > Open.checkAnswer();//ここで、Openが赤字になる。 Javaの「変数のスコープ」についての理解を再度確認しましょう。また、それが解決したところでchekAnswer()メソッドが属するServiceManagement はActivityなので、恐らく質問者さんが思っているようには動作しない可能性が高いです。試してみれば分かります。更に、ButtonのonClick()は通常、人間がボタンをタップしたときにAndroid側から呼ばれるメソッドです。
RunningReo

2020/10/18 11:11

ご回答ありがとうございます。 スコープについての理解が薄かったと、ご指摘いただいてから調べている際に気づきました。
RunningReo

2020/10/18 11:14

まだまだ、知識が足りないようで、折角ご回答していただいたのですが、意味を理解できませんでした。一先ず、そこを理解してからこれ以降の文に対する取り組みをしたいと思います。
dodox86

2020/10/18 12:23

> 一先ず、そこを理解してからこれ以降の文に対する取り組みをしたいと思います。 もちろん、RunningReoさんの進め易いようにしていただいて結構です。 一部回答を含んではいましたが、質問件名がonClickメソッドのアクセス方法であり、直近の問題が「Openが赤字になる」だったので、最終的な問題の解決は先になりそうに思ったのでコメントに留めました。その後の成り行きで質問の内容の変わるかまたは新たな質問になると考えました。
RunningReo

2020/10/18 14:01

ありがとうございます。 調べてもなかなか理解できそうにないので、質問に戻らせていただきます。 そうですね。かなり理解の糸口がないのですが、自分の中の疑問点を一つ上げさせていただきます。。 ServiceManagementのインスタンスには、OpenQメソッドが含まれていないのは何故でしょうか?
RunningReo

2020/10/18 14:02

間違いました。OpenQメソッドではなく、checkAnswerメソッドです。
dodox86

2020/10/19 04:33

> ServiceManagementのインスタンスには、OpenQメソッドが含まれていないのは何故でしょうか? > 間違いました。OpenQメソッドではなく、checkAnswerメソッドです。 ServiceManagementクラスにはpublic void OpenQ()、そしてpublic void checkAnswer(View view)のどちらのインスタンスメソッドも含まれていますが。 ServiceManagementも、basicTheoryクラスも、Activityっぽいですが、 > ServiceManagement Open = new ServiceManagement(); とインスタンス化しようとしていて、すみませんがどういう意図、あるいは最終的にどのような動きを目指しているのか質問文中からは分からないです。Activityを自力でインスタンス化するような機会は、まずありません。もしかすると、別のActivtyの画面の起動の仕方を誤解されていませんでしょうか。
RunningReo

2020/10/20 12:07

>ServiceManagementクラスにはpublic void OpenQ()、そしてpublic void checkAnswer(View view)のどちらのインスタンスメソッドも含まれていますが。 ご返信ありがとうございます。なるほど。その時点では、インスタンスの中に含まれているのですね。 >すみませんがどういう意図、あるいは最終的にどのような動きを目指しているのか質問文中からは分からないです 知識不足でおかしなことを言っていまうかもしれませんが、最終的な動きとしては、自分で作成したクラス、ServiceMabagementからbasicTheoryへと、継承し親クラスのメソッドを子クラスで定義したいのです。 が、しかし自分自身が何か勘違いをしているようで、
dodox86

2020/10/20 23:42

そうですね。少々勘違いされている気がします。その為、細かい部分ですが用語の使い方で違和感を感じるのが正直なところです。RunningReoさんが伝えたいことと私が受けとったことが食い違っている可能性も大、です。 > その時点では、インスタンスの中に含まれているのですね。 "その時点では"、とはどういうことでしょう。一般的にインスタンスメソッドに関して、そのように表現はしません。 前述したようにServiceManagementクラスにはpublic void OpenQ()、そしてpublic void checkAnswer(View view)のどちらのインスタンスメソッドも含まれています。それらのクラスをインスタンス化することでそれらメソッドを使えるようになりますが、それを指していますか。 > 最終的な動きとしては、自分で作成したクラス、ServiceMabagementからbasicTheoryへと、継承し親クラスのメソッドを子クラスで定義したいのです。 が、しかし自分自身が何か勘違いをしているようで、 言葉通り自分で作成したクラス、ServiceMabagementからbasicTheoryへ継承したいということであれば、 public class basicTheory extends ServiceManagement で継承したことになります。ですが、それがやりたいことなのでしょうか。ご提示のコードではそのどちらもActivityを継承しているので、そうでもないような気がしています。 Androidプログラミングは、Javaプログラミングができることは前提ですが、それだけではアプリは作れません。AndroidのOS、API、開発ツールであるAndroid Studio特有の事情があることを理解してコーディングしないとアプリは作れません。それが例えばActivityで、Activityを継承したクラスは通常、自分でインスタンス化することはなく、Android OSから呼ばれるか、startActivity()を使います。 https://developer.android.com/training/basics/firstapp/starting-activity?hl=ja 単にクラスを継承したいのであれば、ServiceManagementとbasicTheoryに extends AppCompatActivity を付けている意図がどうもよく分かりません。それらはActivity(要は、画面)なのではないですか。
RunningReo

2020/10/22 00:07

>"その時点では"、とはどういうことでしょう。一般的にインスタンスメソッドに関して、そのように表現はしません。 インスタンス化した時にはOpenQ()も、checkAnswer(View view)もインスタンスメソッドとして含まれているのに、Open.checkAnswer()が使えないのが気になっているという意味で言いました。(OpenQの方は、使えるのに)
dodox86

2020/10/22 00:10

> インスタンス化した時にはOpenQ()も、checkAnswer(View view)もインスタンスメソッドとして含まれているのに、Open.checkAnswer()が使えないのが気になっているという意味で言いました。(OpenQの方は、使えるのに) それは、当初のコードである以下のものについて言っていますか? > ServiceManagement Open = new ServiceManagement(); > Open.OpenQ(); > } > Open.checkAnswer();//ここで、Openが赤字になる。
RunningReo

2020/10/22 00:14

>それは、当初のコードである以下のものについて言っていますか? > ServiceManagement Open = new ServiceManagement(); > Open.OpenQ(); > } > Open.checkAnswer();//ここで、Openが赤字になる。 そうです。
RunningReo

2020/10/22 00:19 編集

二個前の返信でリンクの添付ありがとうございます。 自分自身、javaの文法のみの知識で質問しているので、dodox86にとってはandroidstudioの事情等を無視したおかしな発言になっているかと思います。 それと、OpenQはビルドは通りましたが、起動していないので使えていなかったです。
dodox86

2020/10/22 00:28

> 自分自身、javaの文法のみの知識で質問しているので、 えと、それこそJavaの文法部分のお話です。ですので、一番最初のコメントで「変数のスコープ」についての指摘をしました。当該コードは問題の部分のみ抜粋すると、以下のような構造になります。 > void onCreate() { > .... > ServiceManagement Open = new ServiceManagement(); > Open.OpenQ(); > } > > Open.checkAnswer();//ここで、Openが赤字になる。 > 見ての通り、onCreate()メソッドの外、言うなればbasicTheoryクラスのフィールド(それも文法違反だけど)のような扱いになっています。ServiceManagemenクラスのインスタンスの参照を収める変数Openが、ServiceManagement Open = new ServiceManagement(); で宣言したときの可視範囲(つまりスコープ)を超えています。ですので、コンパイルエラーになっているはずです。Android Studioのエディター上で赤字での表示かどうかより、コンパイルエラーメッセージに注意を向けてください。
RunningReo

2020/10/23 04:03

ご返信ありがとうございます。なかなか、質問がめちゃくちゃだったので、大変だったと思います。 何故、そうなったのか。自分自身、Activityというものを理解していなかったことが原因でした。 つまり、ActivityとJavaクラス(中身を自分で書き込む必要のあるクラス、、純粋なクラスと勝手に呼びます)を全く同じものだと思っていたことです。(もちろん、クラスという点では同じですが)Activityは、作成した時点で他のクラスを継承しているので、中身がある程度作られたものです。自分は、これを純粋なクラスだと思っていたのです。本当に、恥ずかしながら。 自分がやるべきことは、純粋なクラスをもちいてOpenQメソッド、checkAnswerメソッドをそれぞれコンストラクタとして持つ、クラスを二つ作ることでした。 と思ったので、一先ず作ってみます。意味不明でしたらすみません。
dodox86

2020/10/23 04:09

> Activityは、作成した時点で他のクラスを継承しているので、中身がある程度作られたものです。自分は、これを純粋なクラスだと思っていたのです。 ... > 自分がやるべきことは、純粋なクラスをもちいてOpenQメソッド、checkAnswerメソッドをそれぞれコンストラクタとして持つ、クラスを二つ作ることでした。 分かっていただけたようで良かったです。(※むしろ、ご自身でお気付きになったので良かったと思っています) Activityは特殊な(と書くと言い過ぎですが)クラスで、Android OSの管理下で動きます。通常はプログラマー自身がインスタンス化することなどないです。インスタンスオブジェクトの生存期間も、Android OSが管理します。 https://developer.android.com/guide/components/activities/intro-activities?hl=ja > 一先ず作ってみます。 そうですね。それがよろしいかと思います。本質問は作業の進捗で適切に編集するなり、質問の前提が崩れてしまうようで編集が難しいのであれば、ご自身で閉じてください。(判断はお任せします)
RunningReo

2020/10/23 11:26

長々と、お付き合いありがとうございます。そして、ご回答ありがとうございました。 自分で気づくという学びができて良かったです。 この質問は閉じたいと思います。
guest

回答1

0

自己解決

Activityを何となく作っていたけども、普通のjavaクラスとは違う。
Activityを遷移させるプロセスがメインだったので、Acticityは絶対に必要なものという勘違いをしていた。Activityは、飽くまでも特殊なjavaクラスであることをお忘れなく

投稿2020/10/23 11:29

RunningReo

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問