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

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

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

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

Android

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1070閲覧

AndroidStudio画像の保持の仕方

nine_fish397

総合スコア8

Java

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

Android

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/07/03 05:13

編集2020/07/03 08:44

今、タップしてたまごのカウントダウンを行い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(); } }

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

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

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

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

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

hoshi-takanori

2020/07/03 05:58

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

2020/07/03 06:10

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

2020/07/03 09:42

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

2020/07/03 13: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);//たまごの差分 }
guest

回答1

0

ベストアンサー

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

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

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

java

1 public void onButton(View view) { 2 3 if (c > 0) { 4 c--; 5 // カウントダウンした値を保存する 6 SharedPreferences.Editor editor = preferences.edit(); 7 editor.putInt("count", c); 8 editor.apply(); 9 10 } 11 12 // データ表示 13 displayData(); 14 } 15 16 public void displayData() { 17 ((TextView) findViewById(R.id.tv)).setText("" + c); 18 19 if (c >= 70) { 20 ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg0);//最初のたまごの画像 21 } 22 if (c< 70) { 23 ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg1);//たまごの差分 24 } 25 if (c <40) { 26 ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg2);//たまごの差分 27 } 28 if (c < 10) { 29 ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg3);//たまごの差分 30 } 31 if (c <= 0) { 32 ((TextView) findViewById(R.id.tv)).setText("クリアー"); 33 ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egga);//たまごの差分 34 } 35 }

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

diff

1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_main); 5 // ファイルの準備 6 preferences = getSharedPreferences("count_data", MODE_PRIVATE); 7 8 // データの読込(初期値100) 9 c = preferences.getInt("count", 100); 10 11 // データ表示 12- ((TextView) findViewById(R.id.tv)).setText("" + c); 13+ displayData(); 14 }

diff

1 public void onReset (View view){ //リセットボタンのメソッド 2 3 4 new AlertDialog.Builder(MainActivity.this) //ダイアログ 5 .setTitle("カウントをリセットをしますか(try to reset)?") 6 .setMessage("Yseでリセット") 7 .setIcon(R.drawable.er) 8 .setPositiveButton( 9 "Yes", 10 new DialogInterface.OnClickListener() { 11 @Override 12 public void onClick( 13 DialogInterface dialog, int which) { 14 preferences = getSharedPreferences("count_data", MODE_PRIVATE); 15 SharedPreferences.Editor editor = preferences.edit(); 16 editor.clear(); 17 editor.commit(); 18 c = preferences.getInt("count", 100); 19 // データ表示 20- ((TextView) findViewById(R.id.tv)).setText("" + c); 21- ((ImageView) findViewById(R.id.egg)).setImageResource(R.drawable.egg0);//リセット時最初のたまごの画像へ 22+ displayData(); 23 24 25 } 26 }) 27 .setNegativeButton("No", null) 28 .show(); 29 30 31 }

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

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

java

1 public void displayData() { 2 TextView tv = (TextView) findViewById(R.id.tv); 3 ImageView egg = (ImageView) findViewById(R.id.egg); 4 5 tv.setText("" + c); 6 7 if (c >= 70) { // c は 70 〜 100 8 egg.setImageResource(R.drawable.egg0);//最初のたまごの画像 9 } else if (c >= 40) { // c は 40 〜 69 10 egg.setImageResource(R.drawable.egg1);//たまごの差分 11 } else if (c >= 10) { // c は 10 〜 39 12 egg.setImageResource(R.drawable.egg2);//たまごの差分 13 } else if (c >= 1) { // c は 1 〜 9 14 egg.setImageResource(R.drawable.egg3);//たまごの差分 15 } else { // c は 0 16 tv.setText("クリアー"); 17 egg.setImageResource(R.drawable.egga);//たまごの差分 18 } 19 }

投稿2020/07/03 21:17

編集2020/07/03 21:19
hoshi-takanori

総合スコア7893

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

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

nine_fish397

2020/07/04 06:35

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問