###前提・実現したいこと
前提として、Javaに対する知識は初心者です。用語の誤用、不明瞭な説明などありましたらすみません。
都度指摘していただけたら幸いです。何が分からないかも分からない状態です。
未経験での新卒で入社し、即業務でアプリ開発をアサインされ、社内に先輩エンジニアが一人のみと、
どうしても自力で乗り切らなければならない状況です。
AndroidStudioを用いて、ギャラリー内の写真からジグソーパズルを作成するアプリを作っています。
ギャラリーで選んだ画像をBitmap変数にして、
ギャラリーで画像選択→分割ピース数の設定→実際のパズル操作画面→完成画面
という各Activityに同一の画像を受け渡して表示する機能を実装したいと思っています。
画像選択→分割ピース数の設定
までは受け渡しに成功しました。
###発生している問題・エラーメッセージ
ですが、分割ピース数を設定し(…まだ分割数の変更は実装していませんが。)、この内容でパズル作成、をすると
その時点でパズル画面に移行せずアプリが落ちてしまいます。
ジグソーパズル部分は、ネットに公開されているソースコードを引用、改造しているのですが(URLは後述します)
複数JAVAファイルで一つのパズル部分Activityを構成している(Puzzle.JAVA/PuzzleView.JAVA/PuzzlePiece.JAVA/PuzzleBoard.JAVAの四つです)ので
画像選択→分割ピース数の設定のように、画像選択.JAVAから設定.JAVAへのBitmapデータ受け渡しのように単純なものではなく
設定.JAVAからPuzzle.JAVAに受け渡ししても、画面を描画するのはPuzzleView.JAVAだったり、
ピース部分の移動を管轄するのがPuzzlePiece.JAVAだったり(そのデータをPuzzleViewに読み込んでいる?)なので
どこに、受け取ったビットマップ画像を読み込ませるだとか、ピースをタップしたら音が鳴るだとか、を記述すればいいのか不明なんです。JAVAファイルが1つであれば、少なくともどこかに要素が当てはまるはずなのですが。
エラーメッセージ
LogCatより
05-06 18:52:05.778 19081-19081/com.example.hikaru923.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hikaru923.myapplication/com.example.hikaru923.myapplication.Puzzle}: android.view.InflateException: Binary XML file line #27: Error inflating class com.example.hikaru923.myapplication.PuzzleView
(以下at...の羅列)
Caused by: android.view.InflateException: Binary XML file line #27: Error inflating class com.example.hikaru923.myapplication.PuzzleView
(at...)
Caused by: java.lang.reflect.InvocationTargetException
(at...)
Caused by: java.lang.NullPointerException
(at...)
以上です。ここを省略したら分からない、などありましたら遠慮なくご指摘下さい。
###該当のソースコード(最後にGitHubでアップロードしています。
JAVAファイルです。
(SelectPhoto.JAVAの一部。ここからSettingPage.JAVAまでは遷移可能です。)
...
intent intent = new Intent(this, SettingPage.class); intent.putExtra("DATA", bmp); startActivityForResult(intent,0);//Bitmapデータ"bmp"を、ページ遷移しつつ渡す
・・・
(SettingPage.JAVAの一部)
...
Bitmap bmp = null;//Bitmap変数"bmp"を定義する
...
Intent intent = getIntent();//インテントからデータの受け取り、変数に代入 bmp = intent.getParcelableExtra("DATA"); imageView = (ImageView) findViewById(R.id.imageView) ; imageView.setImageBitmap(bmp);
...
public void onClick(View v) { if (v == button) { //ボタンが押されたらbmpをPuzzle.JAVAに遷移しつつ渡す Intent intent = new Intent(this, Puzzle.class); intent.putExtra("DATA", bmp); startActivityForResult(intent,0); }
・・・(何故Puzzle.JAVAを指定しているのか:setContentViewでLayoutのxmlファイルを参照していて
メイン画面っぽいので・・・深く理解出来ていません。)
(Puzzle.JAVAの一部)
...
Bitmap bmp = null;//Bitmap変数"bmp"を定義する
...
Intent intent = getIntent();//インテントからデータの受け取り、変数に代入 bmp = intent.getParcelableExtra("DATA");
・・・
(PuzzleView.JAVAの一部・・・何故PuzzleViewなのか
:private Puzzle puzzle; Resources resources = puzzle.getResources();
と書いてあって、Puzzleからデータを取得している感じだったので・・・)
・・・
public Bitmap bmp;//読み込んできたbmpを初期化、また、元のソースで指定してあったimgという型も念のため public Bitmap img; ・・・
###試したこと
各パズルJAVAファイル内に場所を小まめに変えて
Intent intent = getIntent();//インテントからデータの受け取り、変数に代入 bmp = intent.getParcelableExtra("DATA");
という記述をしましたが、どうも現状の記述が一番自然かなと思い
このまま放置しています・・・。
###補足情報(言語/FW/ツール等のバージョンなど)
デバッグ用の実機はF-10D,Androidバージョン4.2.2です。Bitmapデータ受け渡し以前はアプリは動作していました。
受け渡す画像がちょっとでも大きいと、設定画面に遷移出来ないなどの危うい点もありますが…(他の機種を借りた時は大丈夫であろう大きさでも無理でした。ちなみに今回使用する画像は32x32程度の小さいものとします。)
AndroidStudioに関しましては、SDKなど出来る限りDLしているつもりです。最新版と捉えていただいて構いません。
参考にさせていただいたサイト様です。
本当に感謝しています。
参照サイト様
ソースコードはかなり割愛しているのでGitHubに該当部分をアップロードしました。
ちなみに
ここを
//Bitmap img = BitmapFactory.decodeResource(resources, R.drawable.image1); //取り合えず以前の仕様(データ内からドロイド画像取得 // img = puzzle.bmp; board = new PuzzleBoard(board_x, board_y, board_w, board_h, puzzle.bmp);
↓こうすると取り敢えず動きます。
Bitmap img = BitmapFactory.decodeResource(resources, R.drawable.image1); //取り合えず以前の仕様(データ内からドロイド画像取得 board = new PuzzleBoard(board_x, board_y, board_w, board_h, img);
重ね重ね申し上げますが、本当に困っています。
質問の仕方もよく分からず、「なんで一番大事な○○の情報がないの?」と
呆れさせてしまっているかも知れませんが、何卒ご容赦ください。
どうかよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/08 23:04 編集
2016/05/08 10:18
2016/05/08 23:43 編集
2016/05/08 11:20
2016/05/08 23:08