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

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

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

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

Q&A

解決済

2回答

1376閲覧

Activityから値をviewに渡し、各レイアウトページごとに違う画像を表示したい

SanaeToyoda

総合スコア1

Android

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

0グッド

0クリップ

投稿2021/11/17 07:56

編集2021/11/19 01:12
  1. 番号リスト### 前提・実現したいこと

Activityから値をviewに渡し、各レイアウトページごとに違う画像を表示したいのですが、photo=0;の画像しか表示されません。
Activityの
Gameview.setphoto(photo)の部分が違うのか?
Viewクラスの
Public void setPhoto(int photo)の部分が違うのか?
色々と書き方を変えてみたりもしましたが、同じ画像(Waikikibeach)しか表示されません。

どのようにコードを書けば良いか教えて下さい。

レイアウトページとアクティビティは複数ですが、
Viewクラスは、全て同じviewクラスを使ってます。

発生している問題・エラーメッセージ

エラーメッセージはありません。

該当のソースコード

*waikikiActivity(本来は、photo=0ですが、画像が変わるかをチェックするため、あえて”1”にしています。

java

1public class WaikikipuzzleActivity extends AppCompatActivity { 2 3 private GameView gameView; 4 int level = 3; 5 private int photo = 1; 6 7 8 private InterstitialAd mInterstitialAd; 9 AdRequest adRequest_interstitial; 10 String AdMobID = "ca-app-pub-3940256099942544/1033173712"; 11 12 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_waikikipuzzle); 18 19 20省略 21 22 23 Toolbar toolbar = (Toolbar) findViewById(R.id.ac_toolbar_toolbar); 24 25 setSupportActionBar(toolbar); 26 gameView = (GameView) this.findViewById(R.id.game_view); 27 gameView.setPhoto(photo); 28 gameView.setOnFinishListener(new GameView.OnFinishListener(){ 29 @Override 30 public void onFinish() { 31 Toast.makeText(WaikikipuzzleActivity.this, "完成!", Toast.LENGTH_LONG).show(); 32 dialog2.show(); 33 34 35 } 36 37 }); 38 39省略

○view

java

1public class GameView extends View { 2 3 private Context mycontext; 4 private Random random = new Random(); 5 private int level = 3;//レベル(初期値は3分割) 6 private int padding = 3; 7 private int photo; 8 private Resources mResources; 9 private Bitmap mBitmap; 10 private Bitmap mBitmap1; 11 private ArrayList<Patch> patches; 12 private int viewH;//viewの高さ 13 private int viewW;//viewの幅 14 private int canvasH;//1つのピースを格納するキャンバスの高さ 15 private int canvasW;//幅 16 private int bitmapH;//1つのピースの高さ 17 private int bitmapW;//幅 18 19 private SoundPool soundPool;//おと 20 private int s_move;//移動OK 21 private int s_error;//移動NG 22 private OnFinishListener listener; 23 24 25 int[] mImageResources = { R.drawable.waikikibeach, R.drawable.diyamondophoto}; 26 27 public void setPhoto(int photo) { 28 this.photo = photo; 29 mResources = getResources(); 30 mBitmap1 = BitmapFactory.decodeResource(mResources, mImageResources[photo]); 31 32 } 33 34 public GameView(Context context){ 35 this(context, null); 36 } 37 public GameView(Context context, AttributeSet attrs) { 38 39 super(context, attrs); 40 mycontext = context; 41 mResources = getResources(); 42 mBitmap = ((BitmapDrawable)mResources.getDrawable(mImageResources[photo])).getBitmap(); 43 bitmapW = mBitmap.getWidth()/level; 44 bitmapH = mBitmap.getHeight()/level; 45 initPatches(); 46 initSound(); 47 } 48 49 //レベルで分割を変える 50 public void setLevel(int level){ 51 this.level = level; 52 bitmapW = mBitmap.getWidth()/level; 53 bitmapH = mBitmap.getHeight()/level; 54 canvasH = viewH/level; 55 canvasW = viewW/level; 56 initPatches(); 57 invalidate(); 58 } 59 60 //ピースの設置 61 public void setmBitmap(Bitmap bitmap){ 62 this.mBitmap = bitmap; 63 invalidate(); 64 } 65 66 public void setOnFinishListener(OnFinishListener listener){ 67 this.listener = listener; 68 } 69 70 //正方形の設定 71 @Override 72 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 73 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 74 int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); 75 int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); 76 int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); 77 if(heightSpecMode == MeasureSpec.AT_MOST){ 78 setMeasuredDimension(widthSpecSize,widthSpecSize); 79 } 80 } 81 82 @Override 83 protected void onDraw(Canvas canvas) { 84 super.onDraw(canvas); 85 drawAllPic(patches, canvas); 86 87 } 88 89 @Override 90 protected void onSizeChanged(int w, int h, int oldw, int oldh) { 91 super.onSizeChanged(w, h, oldw, oldh); 92 viewW = w; 93 viewH = h; 94 canvasW = w/level; 95 canvasH = h/level; 96 } 97 98 private void initSound(){ 99 //クリック時の音 100 soundPool=new SoundPool(2, AudioManager.STREAM_MUSIC,0); 101 s_move = soundPool.load(mycontext,R.raw.s_move,1); 102 s_error = soundPool.load(mycontext,R.raw.s_error,1); 103 } 104 105 private void initPatches(){ 106 patches = new ArrayList<Patch>(); 107 Patch emptyPatch = null; 108 for(int i = 0;i < level;i++){ 109 for(int j = 0;j < level;j++){ 110 Patch patch = new Patch(); 111 112 PicPoint bp = new PicPoint(); 113 bp.setX(i); 114 bp.setY(j); 115 116 PicPoint cp = new PicPoint(); 117 cp.setX(i); 118 cp.setY(j); 119 120 patch.setBitmapPicPoint(bp); 121 patch.setCanvasPicPoint(cp); 122 if(bp.getX() == (level - 1) && bp.getY() == (level - 1)){ 123 patch.setEmpty(true); 124 emptyPatch = patch; 125 } 126 patches.add(patch); 127 } 128 } 129 130 for(int i = 0;i < 50*level;i++){ 131 emptyPatch = exchange(emptyPatch); 132 } 133 134 } 135 136省略 137 138 139//画像を分割してピースを作る 140 private void drawPic(Canvas canvas,Patch patch){ 141 if(patch.isEmpty()){ 142 return; 143 } 144 Rect rb = new Rect(patch.getBitmapPicPoint().getX()*bitmapW + padding, patch.getBitmapPicPoint().getY()*bitmapH + padding, 145 (patch.getBitmapPicPoint().getX()+1)*bitmapW - padding, (patch.getBitmapPicPoint().getY()+1)*bitmapH - padding); 146 Rect rc = new Rect(patch.getCanvasPicPoint().getX()*canvasW + padding,patch.getCanvasPicPoint().getY()*canvasH + padding, 147 (patch.getCanvasPicPoint().getX()+1)*canvasW - padding, (patch.getCanvasPicPoint().getY()+1)*canvasH - padding); 148 149 canvas.drawBitmap(mBitmap, rb, rc, null); 150 } 151 152 153以下省略 154 155

試したこと

GameViewを以下のように変更してみましたが、画像が表示されませんでした。

java

1int[] mImageResources = { R.drawable.waikikibeach, R.drawable.diyamondophoto}; 2 3 public void setPhoto(int photo) { 4 this.photo = photo; 5 mResources = getResources(); 6 mBitmap1 = BitmapFactory.decodeResource(mResources, mImageResources[photo]); 7 8 } 9 10 public GameView(Context context){ 11 this(context, null); 12 } 13 public GameView(Context context, AttributeSet attrs) { 14 15 super(context, attrs); 16 mycontext = context; 17 mResources = getResources(); 18 mBitmap = ((BitmapDrawable)mResources.getDrawable(mImageResources[photo])).getBitmap(); 19 bitmapW = mBitmap.getWidth()/level; 20 bitmapH = mBitmap.getHeight()/level; 21 initPatches(); 22 initSound(); 23 24

補足情報(FW/ツールのバージョンなど)

GameViewは、昔、プロの方に作成してもらったコードで、今回、ゲーム要素を入れるために自分で改変しましたが、ネットで調べながら行ったので、なんとなくしかコード内容を理解できていません。

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

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

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

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

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

jimbe

2021/11/17 09:49

コードはマークダウン記法を用いてご提示ください。 マークダウンに付きましてはヘルプをご参照ください。
jimbe

2021/11/17 10:36

編集ありがとうございます。綺麗にコードのマークダウンの中に表示されました。 ですが・・・残念ながらインデント(コードや xml で各行の先頭にあった空白部分)が無くなってしまっています。 恐らくご自身の開発環境ではインデントがそれぞれ入っていると思いますので、入っていましたら、再度コピペして頂けると完璧かと思います。
SanaeToyoda

2021/11/17 11:11

度々、申し訳ありません。 外出中で、今、PCがないので、帰宅後、確認して、再度、修正します。 ご迷惑をおかけして、申し訳ありません。
jimbe

2021/11/17 12:29

いえ、迷惑等ではありませんので、申し訳なくも思われなくて大丈夫です。 今後の為にもちょっと書き方等を変えて頂ければより良くなるように思いますということです。
guest

回答2

0

ベストアンサー

invalidate しても onCreate は実行されません。
setPhoto で実際に画像取得し直した上で再表示させる必要があるでしょう。


GameView に setmBitmap というメソッドがあり、これが画像を切り替えるものとして動作しているのであれば使えると思いますが、コンストラクタで行っている bitmapW/bitmapH を更新していないので(両変数の使い方が見えないので確実な所は分かりませんが) 動作しなさそうにも見えます。
コンストラクタに従えば setPhoto は次のようになると思います。

java

1 public void setPhoto(int photo) { 2 this.photo = photo; 3 mBitmap = ((BitmapDrawable)mycontext.getDrawable(mImageResources[photo])).getBitmap(); 4 bitmapW = mBitmap.getWidth()/level; 5 bitmapH = mBitmap.getHeight()/level; 6 invalidate(); 7 }

なお、 Resources クラスの getDrawable(int) メソッドは API22 から非推奨になっていまして、 getDrawable(int,Theme) もしくは Context クラスの getDrawable(int) を使うことになっています。

投稿2021/11/17 09:45

編集2021/11/18 10:08
jimbe

総合スコア12632

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

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

SanaeToyoda

2021/11/17 10:17

初めての利用で、記入の仕方が間違っており、申し訳ありませんでした。 GameViewのsetPhotoで画像を取得し直して、再表示させるコードが分かりません。 教えて頂けると助かります。 public void setPhoto(int photo) { this.photo = photo; Imageview img = findViewById(R.id.game_view); img.setBitmapImage(mImageResources[photo]); は、違いますよね。 }
SanaeToyoda

2021/11/17 10:19

初心者マークがついてないですが、初心者です。 すみません。
jimbe

2021/11/17 10:31

謝る必要はありません。ご質問を編集して修正頂ければ助かります、というだけですので。 コードは普通の質問文と同列に書きますと、インデントが無くなったり長い行が折り返されたりでとても読み難いです。 また、場合によってはコピペしてテストすることがあり、それが簡単に出来るようにコードのマークダウンにはコピーする機能ボタンが付いています。 > ~ は、違いますよね。 どこからそのコードが出てきてなぜ違うと思われるのかが分かりません。 そもそも GameView は省略されていて、どのような場合にどのような動作をするのかがこちらには分からないです。 初心者かどうかをどう回答に反映するかは人ぞれぞれと思いますが、問題を解決する為にそれこそあらゆるデータ・情報を集めてテストして失敗して…とやっている様子が伺えれば、お手伝いできることは出来る限りお手伝い致します。
SanaeToyoda

2021/11/17 11:14

中途半端で、分かりずらく申し訳ありませんでした。 もう一度、整理して、コードの掲載方法も教えていただき分かりましたので、全てのコードを掲載し、やりたいこともきちんとまとめて記述しなおします。
SanaeToyoda

2021/11/17 11:16

1日だけ、お時間をください。 お願いいたします。
jimbe

2021/11/17 12:35

teratail には時限はありませんので、幾らお時間をかけられても大丈夫です。 ただ、「後に同様の問題に当たった他の方が同じ質問をしなくても済むように」知識として貯めておくという目的が設定されていますので、もちろん可能な範囲でですが(質問本文に書けるのは1万文字までですし! >< )、情報を出して頂けると良いかと思います。
SanaeToyoda

2021/11/18 07:35

GameViewのコードを全て載せようとすると文字オーバーになります。 どうしたら、良いでしょうか?
SanaeToyoda

2021/11/18 07:46

載せれる文字ギリギリまで、省略しつつ載せました。 よろしくお願いいたします。
SanaeToyoda

2021/11/18 07:49

アドバイスを受けて、以下のようにしてみましたが、画像すら表示されませんでした。 int[] mImageResources = { R.drawable.waikikibeach, R.drawable.diyamondophoto}; public void setPhoto(int photo) { this.photo = photo; mResources = getResources(); mBitmap1 = BitmapFactory.decodeResource(mResources, mImageResources[photo]); } public GameView(Context context){ this(context, null); } public GameView(Context context, AttributeSet attrs) { super(context, attrs); mycontext = context; mResources = getResources(); mBitmap = mBitmap1; bitmapW = mBitmap.getWidth()/level; bitmapH = mBitmap.getHeight()/level; initPatches(); initSound(); }
jimbe

2021/11/18 10:13 編集

おつかれさまです。 本文の文字数オーバーに関しましては、仕様ですので仕方ありません。 別のサイトに載せてそこへのリンクを載せる手もありますが、後日他の方が見た時にもリンク先の情報が見られるように(いつまでも)維持できるかの問題があります。 大抵の場合は、問題の起きる状態が再現できる最低限のコードで構成したプロジェクトを新たに作り、そのコードを載せて頂くのが一番ですが、今回の場合は他の方が作ったコードということでそれをするのも結構手間がかかるかもしれませんね。 コードや xml のインデントをスペース2つにすると、多少は文字数が減らせます^^;;; 一つ裏技として、履歴を使う方法があります。 質問や回答の本文は、修正しても履歴として過去の状態が見られます。ですので、例えば現在はレイアウトを載せていらっしゃいますが、編集でレイアウトを消して GameView だけにしても、履歴には消す前の質問が残っています。(ご自身で確認できると思います。) ですので、本文に「レイアウト xml が必要でしたら編集履歴を参照してください」みたいに書かれていれば、多少手間は掛かりますが得ることは可能になります。
jimbe

2021/11/18 09:54

GameView に setmBitmap というメソッドが見えますが、これは何に使うようのメソッドでしょうか。
jimbe

2021/11/18 10:08

回答を編集致しました。
SanaeToyoda

2021/11/19 01:07

お世話になっています。 おっしゃられた通りに、setPhoto()内のコードを書き換えたら、うまく表示されました。 ありがとうございました。 setPhoto()内で、resouceからdrawableだけを行い、drawableからbitmapは、public GameView(Context context, AttributeSet attrs)内で行ったら、うまくいかなかったのですよね。 違いは、勉強します! GameViewのsetBitmap()の部分は、文字オーバーで掲載できなったのですが、後で、画像を分割(レベル1の3分割なら、縦横3*3の9つに画像を分割)して、スライドパズルのピースを作るので、そこで、使うためのものです。 この度は、投稿の仕方から丁寧に教えていただき、本当にありがとうございました!!
guest

0

java

1public class WaikikipuzzleActivity extends AppCompatActivity { 2 3private GameView gameView; 4int level = 3; 5private int photo = 1; 6 7 8private InterstitialAd mInterstitialAd; 9AdRequest adRequest_interstitial; 10String AdMobID = "ca-app-pub-3940256099942544/1033173712"; 11 12 13 14@Override 15protected void onCreate(Bundle savedInstanceState) { 16super.onCreate(savedInstanceState); 17setContentView(R.layout.activity_waikikipuzzle); 18 19 20 21//全画面表示 22View decor = getWindow().getDecorView(); 23decor.setSystemUiVisibility( 24View.SYSTEM_UI_FLAG_LAYOUT_STABLE 25| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 26| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 27| View.SYSTEM_UI_FLAG_FULLSCREEN 28| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 29| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 30 31 32 33//ダイアログ表示 34DisplayMetrics metrics = getResources().getDisplayMetrics(); 35int dialogWidth2 = (int)(metrics.widthPixels * 0.9); 36 37final AppCompatDialog dialog2 = new AppCompatDialog(this); 38 39dialog2.setContentView(R.layout.waikikipuzzleclear); 40 41WindowManager.LayoutParams lp2 = dialog2.getWindow().getAttributes(); // コンテンツを追加したあと、showの前に記述 42lp2.width = dialogWidth2; 43dialog2.getWindow().setAttributes(lp2); 44 45Toolbar toolbar = (Toolbar) findViewById(R.id.ac_toolbar_toolbar); 46 47setSupportActionBar(toolbar); 48gameView = (GameView) this.findViewById(R.id.game_view); 49gameView.setPhoto(photo); 50gameView.setOnFinishListener(new GameView.OnFinishListener(){ 51@Override 52public void onFinish() { 53Toast.makeText(WaikikipuzzleActivity.this, "完成!", Toast.LENGTH_LONG).show(); 54dialog2.show(); 55 56 57} 58 59}); 60

java

1public class GameView extends View { 2 3private Context mycontext; 4private Random random = new Random(); 5private int level = 3;//默认分3层 6private int padding = 3; 7private int photo; 8private Resources mResources; 9private Bitmap mBitmap; 10private ArrayList<Patch> patches; 11private int viewH;//view的高度 12private int viewW;//view的宽度 13private int canvasH;//一格画布的高度 14private int canvasW;//一格画布的宽度 15private int bitmapH;//一片图片的高度 16private int bitmapW;//一片图片的宽度 17 18private SoundPool soundPool;//声音池 19private int s_move;//移动声音 20private int s_error;//不能移动声音 21private OnFinishListener listener; 22 23 24int[] mImageResources = { R.drawable.waikikibeach, R.drawable.diyamondophoto}; 25 26public void setPhoto(int photo) { 27this.photo = photo; 28invalidate(); 29 30} 31 32public GameView(Context context){ 33this(context, null); 34} 35public GameView(Context context, AttributeSet attrs) { 36 37super(context, attrs); 38mycontext = context; 39mResources = getResources(); 40mBitmap = ((BitmapDrawable)mResources.getDrawable(mImageResources[photo])).getBitmap(); 41bitmapW = mBitmap.getWidth()/level; 42bitmapH = mBitmap.getHeight()/level; 43initPatches(); 44initSound(); 45}

このような記入でよろしかったでしょうか?

投稿2021/11/17 10:23

編集2021/11/17 10:26
SanaeToyoda

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問