android studioでクイズゲーム作ってます。
xmlで設置した
<Button android:id="@+id/answerBtn1"/>
としているボタンの中のandroid:id="@+id/answerBtn1"を、javaの中でString型として使う方法はありますでしょうか?
javaの中で
answerBtn1
というテキストとして、扱いたいのです。
android:text="A"
は、Aを別の処理に使っているので、
android:id="@+id/answerBtn1
の「answerBtn1」というのを、正解判定の処理に使いたくて、処理をどうしたら良いのか悩んでいます。
https://teratail.com/questions/216639
に全く同じ質問があり、
public String getResourceName (int resid)
を入力すれば、いいのかなと思ったのですが、エラーが出て、色々とやってみているのですが全く処理できません・・・
<やってみたこと>
//どのボタンが押されたか
Button answerBtn = findViewById(view.getId());
//IDをストリングで取得・・・ここがうまくいきません
String btnId = answerBtn.getId().toString();としてみたのですが
//エラー: intは間接参照できませんというエラーが出ています。
現在は、android:text="A"のテキストカラーを00000000の透明色にして、クイズの正誤判定に対応しているのですが、ボタンのtextは後から使う予定なので、なんとかIDなどで処理できないかなと思っています。
テキストと違っていても、正解、という問題が混じっているため、正誤判定と、実際の答えはこれ!という表示が2通り必要なのです。
android:text
でないもので、かつ、String型で参照できるものでも良いのですが・・
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
</LinearLayout>android:layout_height="fill_parent" tools:context=".MainActivity" android:orientation="vertical" android:gravity="center_horizontal" android:background="@android:color/white"> <ImageView android:id="@+id/questionImage" android:layout_width="300dp" android:layout_height="200dp" android:src="@drawable/a"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:gravity="center_horizontal" > <Button android:id="@+id/answerBtn1" android:layout_width="60dp" android:layout_height="60dp" android:onClick="checkAnswer" android:text="c" /> </LinearLayout>
package com.te.gazouonseijava;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private TextView countLabel; private ImageView questionImage; private Button answerBtn1; private Button answerBtn2; private Button answerBtn3; private Button answerBtn4; private Button answerBtn5; private Button answerBtn6; private Button answerBtn7; private Button answerBtn8; private Button answerBtn9; private Button answerBtn10; private Button answerBtn11; private Button answerBtn12; private String rightAnswer; //String文字型であることに注目したい private int rightAnswerCount = 0; //初期化=定義 private int quizCount = 1; //初期化=定義 static final private int QUIZ_COUNT = 50; //全部の出題数を入れるのだ!! private int randomNum; //これで{}をまたげる
//private int randomNum;は死ぬほど重要です
ArrayList<ArrayList<String>> quizArray = new ArrayList<>(); String quizData[][] = {
//{"画像名","正解"},
//,←これ[,]が必要なんだ!!!
{"a","a"},
{"b","b"},
}; MySound mySound = new MySound(); // ① サウンド準備 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ② 効果音の準備wavだけどmp3sで定義されている。クイズデータと同じ並びで並べる int[] mp3s = { R.raw.a, //[0] R.raw.b, //[1] R.raw.c, //[2] };
//ここに音声を、クイズと全く同じ順番で並べましょう!!!!!!【追加していく2/2】
mySound.onCreate(this, mp3s); // ③ 初期化、言葉がまぎらわしいがただ定義(代入)しただけ questionImage = findViewById(R.id.questionImage); answerBtn1 = findViewById(R.id.answerBtn1);
//quizDataからクイズ出題用のquizArrayを作成する
for (int i = 0; i < quizData.length; i++) {
//新しいArrayListを用意
ArrayList<String> tmpArray = new ArrayList<>();
//クイズデータを追加
tmpArray.add(quizData[i][0]); //画像名
//tmpArrayをquizArrayに追加する
quizArray.add(tmpArray);
}
showNextQuiz(); } public void showNextQuiz() {
//クイズカウントラベルを更新
countLabel.setText("Q" + quizCount);
//ランダムな数字を取得
Random random = new Random();
int randomNum = random.nextInt(quizArray.size());
//randomNumを使ってquizArrayからクイズを一つ取り出す
ArrayList<String> quiz = quizArray.get(randomNum);
//画像をセットする
questionImage.setImageResource(
getResources().getIdentifier(quiz.get(0), "drawable", getPackageName())
);
//正解をrightAnswerにセット
rightAnswer = quiz.get(1);
} public void checkAnswer(View view){
//どのボタンが押されたか
Button answerBtn = findViewById(view.getId());
//ボタンのIdをテキストで取得・・・ここが分かりません
String btnId = answerBtn.getId().toString(); //エラー: intは間接参照できませんというエラーが
String alertTitle; if (btnId.equals(rightAnswer)) { //ここをボタンID=rightAnswerに変えたい alertTitle = "せいかい!!"; rightAnswerCount++; } else { alertTitle = "まちがっているよ"; } //if elseの波かっこ群終了
//ダイアログを作成
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(alertTitle);
builder.setMessage("こたえは" + rightAnswer + "だよ");
builder.setPositiveButton("つぎへいく", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (quizCount == QUIZ_COUNT) {
//結果画面へ移動
Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
intent.putExtra("RIGHT_ANSWER_COUNT", rightAnswerCount);
startActivity(intent);
} else { quizCount++; showNextQuiz(); //showNextQuiz実行する } //elseとじ } //160行付近のpublic void onClick(DialogInterface dialog, int which) とじ }); //"つぎへいく"のsetPositeveButton とじ builder.setCancelable(false); builder.show(); } // checkAnswer波かっことじ
} //大きいMainとじ
android:id="@+id/answerBtn1"
のanswerBtn1をString型で参照できれば、嬉しいです。
String btnId = answerBtn.getText().toString(); //エラー: intは間接参照できません
ここの部分の、idをjavaでString型で参照する、書き方を知りたいです。
こんな感じに書いてみれば?みたいなサンプルコードをいただけると助かります・・。
1~2行で良いので、具体的なサンプルコードをいただけませんでしょうか?
大変申し訳ございませんが、javaの理解力が低いため、サンプルコードをよろしくお願いいたします。
あなたの回答
tips
プレビュー