4択クイズアプリ

Android Studio 4択クイズアプリ開発講座 第8回「Warning の解消」

 

この記事は Android Studio 3.x / 4.0.1 に対応しています。
Android Studio 4.1 以降のバージョンをお使いの方はこちらをお読み下さい。

この講座の目次はこちら
 

4択クイズアプリの開発では Android Studio 3.1.4 を使用していましたが、Android Studio 3.6 以降では Warning がたくさん表示されるようになっているかと思います。


 

Warning はエラーとは違い「注意・お知らせ」のようなものです。そのままにしておいても、現在のところプログラム自体に影響はありませんが、コードがマーカーだらけだとあまり良い感じはしないですよね。

そこでこの記事では 4択クイズアプリの Warning の解消法を紹介していきます。先ほども書いたようにプログラム自体に影響は出ないので、気になる方だけ進めてみてください
 


 
 

解説

activity_main.xml

まずはクイズを出題する画面 activity_main.xml にある Warning を消していきましょう。

activity_main.xml を開いてください。

TextView

はじめに TextView 要素に表示されている Warning を消していきます。

24 行目あたりにある「Question」と表示している TextView を見てください。


 
 

色が変わっている部分にカーソルを合わせてみると

Hardcoded string "Question", should use "@string" resource

と表示されます。


 

これは「ハードコードされている文字列 "Question" には @string リソースを使うべきです」という Warning です。

@string リソースは文字列を定義するために用意されている strings.xml ファイルのことです。ハードコードとは strings.xml を使わずに直接文字列を書いていることを指しています。
 

Warning のメッセージの通り strings.xml に文字列を定義していきましょう。

Android Studio 画面左側のプロジェクト構造から app → res → values → strings.xml を開きます。


 

strings.xml を開いたら、以下のように文字列を定義します。

<string name="question">Question</string>

name 属性にはこの文字列を呼び出す時に使う名前を指定して、<string></string> の間に定義する文字列を書きます。
 
 

文字列を定義したら activity_main.xml に戻って

android:text="Question"

android:text="@string/question"

に変更します。

@string/名前と書くことで、strings.xml に定義した文字列を呼び出すことができます。
 
 

Warning が消えたでしょうか?


 
 

次は 16 行目あたりにある「Q1」と表示している TextView です。

ここも先ほどの「Question」と同じ方法で Warning を消すことができますが、少しだけ書き方が変わります。

「Q1」の 1 の部分は第何問目かを表すので、クイズを出題するたびに更新します。このようにあとで数値を入れる部分には %d を使用します。

<string name="quiz_count">Q%d</string>

今回は数値なので %d ですが、文字列を入れる場合は %s を使用します。
 

activity_main.xml での書き方は同じで

android:text="@string/quiz_count"

と書きます。
 

strings.xml はいつ役立つ?
strings.xml は何度も同じ文字列を使う時に役立ちます。
例えば5つのアクティビティの中に「Hello」と表示する TextView があったとします。
アプリを開発する途中で「Hello」を「こんにちは」に変えたくなった時に、strings.xml に定義しておけば strings.xml 内の1箇所を変更するだけで全てのアクティビティの TextView の文字列を変更することができます。
他にも翻訳ファイルを作成する時にも役立ちます。
参考:【Android Studio】アプリを翻訳・ローカライズする方法

 
 

Button

次は 32 行目あたりにある android:text="answer1" の Warning です。

これも TextView と同じように strings.xml から文字列を指定していないことが原因なので、同じ方法で消していきましょう。
 

strings.xml に文字列を定義します。

<string name="btn_answer">answer</string>

activity_main.xml の Button 要素の text を以下のように変更します。

android:text="@string/btn_answer"

 

この「answer」は一時的に表示しているだけの文字列なので、他のボタン answer2, answer3, answer4 も @string/btn_answer を使って同じように Warning を消して下さい。
 
 

avtiviry_result.xml

次は結果画面である activity_result.xml ファイルです。

ここに出ている Warning も全て strings.xml を使用していないことが原因なので、activity_main.xml と同じ手順で修正してください。

ポイントは「3 / 5」と「トータルスコア : 333」に %d を使うことです。
 

strings.xml のサンプル

<string name="result_title">結果</string>
<string name="result_score">%d / 5</string>
<string name="result_total_score">トータルスコア : %d</string>
<string name="btn_return">もどる</string>

 
 

MainActivity.java

次はクイズを出題する MainActivity.java ファイルです。
上から順番に Warning を消していきましょう。
 

33行目あたり

String quizData[][] = {

 
quizData の上にカーソルを合わせると C-style array declaration of field 'quizData' と表示されます。


 

これは「C言語のスタイルで配列が宣言されています」という Warning です。
 

Java のスタイルにするために、以下のように書き換えてください。

String[][] quizData = {

 

どちらの書き方でも良いですが、Java で開発しているので String[][] quizData を使用しましょう。
 
 

60行目あたり

for (int i = 0; i < quizData.length; i++) {

for の上にカーソルをあわせると 'for' loop replaceable with enhanced 'for' と表示されます。


 

これは「for ループをより良い方法で書き換えることができます」という Warning です。
 

for の上でクリックすると、左側に豆電球のマークが出るのでクリックします。


 

Replace with enhanced 'for' をクリックします。


 

for ループが書き換わって Warning が消えたことが確認できると思います。

for (String[] quizDatum : quizData) {

 

この書き方は「quizData 配列から要素を quizDatum という名前で一つずつ取り出す」という方法です。

今まで quizData[i] と書いていた部分が quizDatum にあたるので、都道府県名の取り出し方が

tmpArray.add(quizData[i][0]);

から

tmpArray.add(quizDatum[0]);

に変わっています。
 

どちらの書き方でも良いですが、プログラミング初心者の方は配列のイメージをつかみやすい for (int i = 0; i < quizData.length; i++) で書くことをオススメします。

配列の使い方に慣れてきたら for (String[] quizDatum : quizData) を使って、効率的なコードを書いていきましょう
 
 

82行目あたり

countLabel.setText("Q" + quizCount);

文字列の上にカーソルを合わせると Do not concatenate text displayed with setText. Use resource string with placeholders. と表示されます。


 

これは「文字列を連結しないで、string リソースでプレースホルダーを使ってください」という Warning です。

string リソースとは strings.xml ファイルのことで、プレースホルダーは strings.xml に定義した「Q%d」の %d のことです。
 

<string name="quiz_count">Q%d</string>

%d の部分に、問題番号を入れて表示してみましょう。
 
 

countLabel.setText("Q" + quizCount); を以下のように書き換えてください。

countLabel.setText(getString(R.string.quiz_count, quizCount));

getString メソッドを使って strings.xml に定義した文字列を取得します。文字列は R.string.名前 と書きます。

getString メソッドの第二引数には %d の部分に入れる数値を指定します。
 
 

ここで一度アプリを実行してみて下さい。

問題番号が Q1 → Q2 → Q3 と表示されるでしょうか?


 

正しい名前を指定しているのに R.string.quiz_count 部分がエラーになってしまう場合は、Android Studio を再起動してみてください。
 
 

ResultActivity.java

ResultActivity.java では、スコアラベルとトータルスコアラベルの2箇所に Warning が出ていますが、修正方法は MainActivity.java の「Q1」と同じです。

33 行目あたり

変更前:resultLabel.setText(score + " / 5");
変更後:resultLabel.setText(getString(R.string.result_score, score));

 

34行目あたり

変更前:totalScoreLabel.setText("トータルスコア : " + totalScore);
変更後:totalScoreLabel.setText(getString(R.string.result_total_score, totalScore));

 
 

まとめ

以上で全ての Warning を解決することができました。

はじめにも書いたように Warning がアプリの動作にすぐに影響することはないですが、全て解決しておくとコードがスッキリとして気持ちが良いですね。

Android Studio では Warning の横に表示される豆電球をクリックすれば解消法を丁寧に提案してくれます。今後他の Warning が表示された場合は、そちらを活用してみてください
 

サンプルコード

完成版のサンプルコードは GitHub からダウンロードできます。
GitHub:https://github.com/codeforfun-jp/quizapp
参考:GitHubからAndroid Studio プロジェクトをダウンロード・実行する方法
 
 

クイズアプリ開発講座の完全版について


 

もっとアプリ開発をしてみたい!自分のアプリをリリースしたい!という方のために、この講座の完全版をご用意しました。
 

完全版では

  • SQLite Databaseを使ってのクイズ管理
  • クイズカテゴリの選択
  • 正解・不正解の効果音
  • AdMob バナー・インタースティシャル広告
  • Image Asset Studio(アイコン作成ツール)の使い方

などを実装していきます。
 

これらのコードはクイズアプリ以外にも利用できるコードばかりなので、今後アプリを開発していく時に必ず役立つと思います。
 

さらに3つの特典

  1. Google Play Games リーダーボード・実績の実装方法
  2. 画像を使ったクイズアプリの作り方
  3. 答えを入力するクイズアプリの作り方

もご用意しました。
 

講座ボーナス
 

全手順の動画付きで、アプリの開発から公開・アップデートまで出来る講座になっています。

初めてアプリを作るという方もぜひ挑戦してみてください
 

 
 

ABOUT ME
Sara
Sara
「わかりやすく・シンプル」をモットーに、スマホアプリ・ウェブアプリの作り方を紹介します。 独学でプログラミングを勉強をしている方、基礎は勉強したけれど次に何をすれば良いか分からない...という方のお役に立てるサイトを目指しています🙂
独学は難しそうと感じたら

 
独学でプログラミングを勉強するのは難しそう、効率的にプログラミングを学びたいという方はオンラインスクールがオススメです。

オンラインスクールを選ぶときのポイント

  • 無料体験があること
  • 個別サポートがあること

自分にあったスタイルを見つけるために、無料体験のご利用をオススメします。(無料体験後に自分には合わないなと感じたらハッキリ断ってしまって問題ありません。)
 
個別サポートもプログラミング学習に挫折しないために重要なポイントです。エラーや困った時にすぐに個別対応をしてくれるスクールを利用して下さい。

ここでは3つのオンラインスクールを紹介します。
全て無料体験がありますので、ぜひ自分に合ったスクールを見つけてみて下さい????
 

1. TechAcademy(テックアカデミー)

オンライン完結で勉強できるスクールで、コースがとても充実しています。チャットで質問すればすぐに回答を得られるのが一番のおすすめポイントです。
オリジナルのサービスやアプリの開発もサポートしてくれるので、開発したいものが決まっている人にもオススメです。

無料体験はこちら

2. CodeCamp(コードキャンプ)

一対一で受講できる個別指導のプログラミングスクールです。
Webデザイン・Webサービス開発・アプリ開発などを幅広く学習することができます。
マンツーマンなので自分のペースで学習できて、質問もその都度できるのがメリットです。

無料体験レッスンはこちら

3. Treehouse

英語でも良い、英語とプログラミングを同時に勉強したいという方は Treehouse がオススメです。月25ドルで始めることができて、たくさんのプログラミング言語を学ぶことができます。
個別サポートはありませんが、掲示板が充実しています。ほとんどの場合、質問してから30分程度で回答を得ることができます。

7日間の無料体験はこちら

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA