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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

2377閲覧

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

hikaru923

総合スコア27

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/05/08 06:32

編集2016/05/08 08:47

###前提・実現したいこと

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

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

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

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

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

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

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

guest

回答2

0

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

Java

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

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

投稿2016/05/08 09:12

yona

総合スコア18155

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

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

hikaru923

2016/05/08 23:04 編集

回答ありがとうございます! 質問文にも書きましたが、ギャラリーから画像選択→パズルの設定画面 まではIntentで画像の受け渡しが出来たので、その流れでいけないものかと思っていました。 今後はピース数などのみ受け渡しするよう設計してみます。 ただ今回はもう後に引けない状態でして・・・回答にケチを付けるわけではないのは伝わると嬉しいです。 他に画像を他Activityへ受け渡す方法はありますでしょうか… キーワードだけでもお教え頂けると幸いです。 以下全文です。 ``` Caused by: java.lang.NullPointerException at android.graphics.Bitmap.createBitmap(Bitmap.java:545) at android.graphics.Bitmap.createBitmap(Bitmap.java:514) at com.example.USERNAME.myapplication.PuzzleBoard.<init>(PuzzleBoard.java:53) at com.example.USERNAME.myapplication.PuzzleView.setPuzzleSize(PuzzleView.java:104) at com.example.USERNAME.myapplication.PuzzleView.init(PuzzleView.java:67) at com.example.USERNAME.myapplication.PuzzleView.<init>(PuzzleView.java:59) at java.lang.reflect.Constructor.constructNative(Native Method)  at java.lang.reflect.Constructor.newInstance(Constructor.java:417)  at android.view.LayoutInflater.createView(LayoutInflater.java:587)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)  at com.example.USERNAME.myapplication.Puzzle.onCreate(Puzzle.java:39)  at android.app.Activity.performCreate(Activity.java:5104)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2266)  at android.app.ActivityThread.access$600(ActivityThread.java:161)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:137)  at android.app.ActivityThread.main(ActivityThread.java:5116)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:511)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)  at dalvik.system.NativeStart.main(Native Method) ``` 業務上の・・・という点に関しましては、私が業務時間内に業務として取り組んでいる、というだけで 利益を見込んで作っているという訳ではないということと、 そもそもとして、GitHubにソースを公開して質問してみては、と社長からアドバイスして頂いたので その辺りに関しては大丈夫です。(私は大丈夫かな・・・とは思いましたが・・・。) ただ、これからも情報管理について常に意識しておきます。 自分の認識もあやふやなので、ここできちんと指摘していただいて助かりました。
yona

2016/05/08 10:18

「パズルの設定画面が上手く行っている」はどうやって確認していますか? Intentから画像を取り出して表示できて、上手く行っていると言えます。当然、画面に表示していますよね。 後に引けないと言っていますが、使い物にならないものを作っても仕方ないと思います。 技術的負債って言葉を調べてみるといいですよ。
hikaru923

2016/05/08 23:43 編集

そうですね。設定画面では画像が表示できています。 もっとも、とても小さな画像ですが。32x32くらいかな・・・(追記:小さい画像ですが 設定した大きさに拡大して表示しています。) 先輩の端末を借りたときは普通に大きな画像も設定画面へ反映出来たので その辺りはもう完全に不明瞭です。 技術的負債…確かにその通りです。何も言い返せません。 私が感じている危機感とぴったりです。 問題を先延ばし先延ばしにしています・・・
yona

2016/05/08 11:20

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

2016/05/08 23:08

おお、確かに出てきました! たぶん私の自前の端末はそれみたいです。 お返事が遅れてしまい申し訳ありません。 パズル部分、作り直してみます。アドバイスありがとうございます。
guest

0

自己解決

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

投稿2016/05/11 11:30

hikaru923

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問