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

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

ただいまの
回答率

88.19%

複数JAVAファイルで構成されているActivityへのデータの受け渡しの方法を知りたいです。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,521

hikaru923

score 27

前提・実現したいこと

前提として、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);

重ね重ね申し上げますが、本当に困っています。
質問の仕方もよく分からず、「なんで一番大事な○○の情報がないの?」と
呆れさせてしまっているかも知れませんが、何卒ご容赦ください。
どうかよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

Intentに含めることができるデータ容量は決まっているので、大きなBitmapの受け渡しはできないですよ。
画面間で受け渡すのは、最小限の情報(URL、ピース数等)にしましょう。
ログの下記の部分を、省略せずに記述してください。

Caused by: java.lang.NullPointerException 
(at...)

また、仕事で作っているコードをGitHubなどの不特定多数が見ることができるところにアップロードしてもいいんでしょうか?場合によっては懲戒解雇や減給になりますよ?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/08 19:43 編集

    そうですね。設定画面では画像が表示できています。
    もっとも、とても小さな画像ですが。32x32くらいかな・・・(追記:小さい画像ですが
    設定した大きさに拡大して表示しています。)
    先輩の端末を借りたときは普通に大きな画像も設定画面へ反映出来たので
    その辺りはもう完全に不明瞭です。

    技術的負債…確かにその通りです。何も言い返せません。
    私が感じている危機感とぴったりです。
    問題を先延ばし先延ばしにしています・・・

    キャンセル

  • 2016/05/08 20:20

    端末に寄っては一辺が2048px以上のBitmapが作れないように制限されていることがあります。
    「to large bitmap」のようなログが出てないでしょうか。

    キャンセル

  • 2016/05/09 08:08

    おお、確かに出てきました!
    たぶん私の自前の端末はそれみたいです。

    お返事が遅れてしまい申し訳ありません。
    パズル部分、作り直してみます。アドバイスありがとうございます。

    キャンセル

check解決した方法

0

yonaさんのアドバイスを元に試行錯誤した結果、bitmapを事実上受け渡すことに成功しました!
bitmapデータを読み込む以前の、Uriデータを受け渡し、受け取った先でbitmapデータに変換する事で
画像の表示を実現できました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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