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

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

ただいまの
回答率

88.91%

AndroidStudio画像の保持の仕方

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 218

nine_fish397

score 7

今、タップしてたまごのカウントダウンを行い0に近づけば近づくほどたまごにヒビがはいってるような画像の差分を表示し、0でたまごを割ってクリアーとなるようなアプリを制作しています。その際カウントの値は保持できているのでアプリを一旦中断してもカウントの値は保存されているのですが、たまごの画像はひび割れている差分までタップしていたのに最初の割れていないもとの卵に戻ってしまいます。一応一度だけタップすれば元のひび割れた差分に戻るのですが、毎回アプリをやめるたびに元の割れていないたまごに戻るのはどうかと思い質問させていただきました。画像の値を保持するためのアドバイスを頂けないでしょうか?

コード
public class MainActivity extends AppCompatActivity {
    private int c;
    private SharedPreferences preferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // ファイルの準備
        preferences = getSharedPreferences("count_data", MODE_PRIVATE);

        // データの読込(初期値100)
        c = preferences.getInt("count", 100);

        // データ表示
        ((TextView) findViewById(R.id.tv)).setText("" + c);
    }


    public void onButton(View view) {

        if (c > 0) {
            c--;
            // カウントダウンした値を保存する
            SharedPreferences.Editor editor = preferences.edit();
            editor.putInt("count", c);
            editor.apply();

        }


        ((TextView) findViewById(R.id.tv)).setText("" + c);

        if (c< 70) {
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg1);//たまごの差分
        }
        if (c <40) {
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg2);//たまごの差分
        }
        if (c < 10) {
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg3);//たまごの差分
        }
        if (c <= 0) {
            ((TextView) findViewById(R.id.tv)).setText("クリアー");
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egga);//たまごの差分

        //これらの画像を保持したい

        }
    }

        public void onReset (View view){  //リセットボタンのメソッド


            new AlertDialog.Builder(MainActivity.this) //ダイアログ
                    .setTitle("カウントをリセットをしますか(try to reset)?")
                    .setMessage("Yseでリセット")
                    .setIcon(R.drawable.er)
                    .setPositiveButton(
                            "Yes",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(
                                        DialogInterface dialog, int which) {
                                    preferences = getSharedPreferences("count_data", MODE_PRIVATE);
                                    SharedPreferences.Editor editor = preferences.edit();
                                    editor.clear();
                                    editor.commit();
                                    c = preferences.getInt("count", 100);
                                    // データ表示
                                    ((TextView) findViewById(R.id.tv)).setText("" + c);
                                    ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg0);//リセット時最初のたまごの画像へ


                                }
                            })
                    .setNegativeButton("No", null)
                    .show();


        }

    public void Shere (View view){//結果シェア
        ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(MainActivity.this);
        builder.setChooserTitle("あああ");
        if (c>=1){
            builder.setText("たまごが生まれるまでのこり"+c+"回だ!");
        }else{
            builder.setText("たまごがうまれたよ!おめでとう!");
        }
        builder.setType("text/plain");
        builder.startChooser();
    }



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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • hoshi-takanori

    2020/07/03 14:58

    画像を保持しようと思うのが間違いで、現在のカウントの値から表示すべき画像は決まるので、アプリが中断から戻ったときにカウントの値に基づいて適切な画像をセットすればいいだけです。

    キャンセル

  • nine_fish397

    2020/07/03 15:10

    画像は保持しなくてもよいのですね、ありがとうございます。しかし、そのすればいいだけのことができずにいるのでもう少し具体的に教えていただけると幸いです。
    例えばカウントcが70より下回れば以下の画像に変えるようなプログラムを組んでいるのですか、この部分にアプリを一旦中断しても適切に表示できるようなコードを書くのでしょうか?
    if (c< 70) {
    ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg1);//たまごの差分
    }

    キャンセル

  • hoshi-takanori

    2020/07/03 18:42

    onButton のうち、if 文が並んでる部分をメソッドに切り出して、アプリが中断から復帰した時にそれを呼び出すようにすればいいかと。ちなみに else if を使った方がいいでしょうね。

    キャンセル

  • nine_fish397

    2020/07/03 22:20 編集

    すみません、言葉の説明だけではやはり理解ができず戸惑ってます、肝心の 中断したあとその画像を呼び出す方法がわかりません。あと、else if文をどこで使うかもわからないですif文の並んでる列に使うと画像の切り替わりが機能しないので多分質問者さんがおしゃっている使い方を私ができていないです。色々試して現在こんな感じになっていますonButtonでsabunメソッドを呼び出していますしかし、これじゃあ結局アプリを再起しても適切な画像は表示できないです。もしお時間に余裕がありました回答に書いていただけると助かります。
    if(c<80){
    sabun();
    }
    if (c<50){
    sabun1();
    }
    if(c<20){
    sabun2();
    }
    if(c<=0){
    sabun3();
    }

    }


    public void sabun(){


    ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg1);//たまごの差分

    }

    public void sabun1(){


    ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg2);//たまごの差分

    }


    public void sabun2(){


    ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg3);//たまごの差分

    }


    public void sabun3(){

    ((TextView) findViewById(R.id.tv)).setText("クリアー");
    ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egga);//たまごの差分

    }

    キャンセル

回答 1

checkベストアンサー

+1

onButton メソッドでは 2 つのことをやっています。

  • データを更新し、保存する
  • データを表示する

このうち、データを表示する部分を、他からも呼べるようにメソッドに分けましょう。
この際、c >= 70 の場合は最初のたまごの画像を表示するようにします。

    public void onButton(View view) {

        if (c > 0) {
            c--;
            // カウントダウンした値を保存する
            SharedPreferences.Editor editor = preferences.edit();
            editor.putInt("count", c);
            editor.apply();

        }

        // データ表示
        displayData();
    }

    public void displayData() {
        ((TextView) findViewById(R.id.tv)).setText("" + c);

        if (c >= 70) {
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg0);//最初のたまごの画像
        }
        if (c< 70) {
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg1);//たまごの差分
        }
        if (c <40) {
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg2);//たまごの差分
        }
        if (c < 10) {
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg3);//たまごの差分
        }
        if (c <= 0) {
            ((TextView) findViewById(R.id.tv)).setText("クリアー");
            ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egga);//たまごの差分
        }
    }

そして、データを表示するところでは必ずこのメソッドを呼ぶようにします。

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         // ファイルの準備
         preferences = getSharedPreferences("count_data", MODE_PRIVATE);

         // データの読込(初期値100)
         c = preferences.getInt("count", 100);

         // データ表示
-        ((TextView) findViewById(R.id.tv)).setText("" + c);
+        displayData();
    }
         public void onReset (View view){  //リセットボタンのメソッド


             new AlertDialog.Builder(MainActivity.this) //ダイアログ
                     .setTitle("カウントをリセットをしますか(try to reset)?")
                     .setMessage("Yseでリセット")
                     .setIcon(R.drawable.er)
                     .setPositiveButton(
                             "Yes",
                             new DialogInterface.OnClickListener() {
                                 @Override
                                 public void onClick(
                                         DialogInterface dialog, int which) {
                                     preferences = getSharedPreferences("count_data", MODE_PRIVATE);
                                     SharedPreferences.Editor editor = preferences.edit();
                                     editor.clear();
                                     editor.commit();
                                     c = preferences.getInt("count", 100);
                                     // データ表示
-                                    ((TextView) findViewById(R.id.tv)).setText("" + c);
-                                    ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg0);//リセット時最初のたまごの画像へ
+                                    displayData();


                                 }
                             })
                     .setNegativeButton("No", null)
                     .show();


         }

あとは細かいことですが、

  • findViewById を何回も呼ぶのは効率が良くないので、まとめましょう。
    (できればフィールドにして、onCreate でセットするとなお良いです。)
  • if の羅列になってる部分は、例えば c が 0 の場合は egg1 -> egg2 -> egg3 -> egga と何回もセットされてしまって効率が悪いので、else if を使って 1 回だけセットする方が良いです。
    public void displayData() {
        TextView tv = (TextView) findViewById(R.id.tv);
        ImageView egg = (ImageView) findViewById(R.id.egg);

        tv.setText("" + c);

        if (c >= 70) { // c は 70 〜 100
            egg.setImageResource(R.drawable.egg0);//最初のたまごの画像
        } else if (c >= 40) { // c は 40 〜 69
            egg.setImageResource(R.drawable.egg1);//たまごの差分
        } else if (c >= 10) { // c は 10 〜 39
            egg.setImageResource(R.drawable.egg2);//たまごの差分
        } else if (c >= 1) { // c は 1 〜 9
            egg.setImageResource(R.drawable.egg3);//たまごの差分
        } else { // c は 0
            tv.setText("クリアー");
            egg.setImageResource(R.drawable.egga);//たまごの差分
        }
    }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/04 15:35

    無事解決できました。if文で画像が切り替わるメソッドをonCreateにも呼び出す必要があったんですね、何度も質問してしまって申し訳ないです、本当に詳細な場所までアドバイスありがとうございます。今後の開発にも参考にさせてもらいます。

    キャンセル

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

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

関連した質問

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