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

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

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

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

Android

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

Q&A

解決済

1回答

6152閲覧

AndroidStudioでのグローバル変数の受け渡しがうまくいかない

bigbox267

総合スコア31

Java

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

Android

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

0グッド

0クリップ

投稿2017/01/07 08:50

編集2017/01/07 12:58

###前提・実現したいこと
android studio で音楽再生のアプリを作っていたのですが値の受け渡しがうまくできなくて困っております。
画像をタッチすることで変数の値を変更させて、switch文で文字列を変更することで、再生するファイルを変えようと思ったのですが、その変更がうまくいっていません。

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

MainActivityでnumの値がうまく受け取れない

###該当のソースコード
MyView2.java

package com.example.******.myapplication_teishutu; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class MyView2 extends View { private float x=0,y=0; private Rect rect = new Rect(10,10,30,30) ; //衝突判定のターゲットを表す四角形 private Rect rect2 = new Rect(50,10,70,30) ; //衝突判定のターゲットを表す四角形 private Rect rect3 = new Rect(90,10,110,30) ; //衝突判定のターゲットを表す四角形 private Common common = new Common(); private Bitmap image; //画像を読み込むためにBitmap クラスのオブジェクトを定義 public MyView2(Context context) { super(context); } public MyView2(Context context, AttributeSet attrs) { super(context, attrs); Resources resource=getContext().getResources(); image = BitmapFactory.decodeResource(resource,R.drawable.mugic); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint p= new Paint(); canvas.drawRect(rect,p); canvas.drawBitmap(image,10,10,p); canvas.drawRect(rect2,p); canvas.drawBitmap(image,50,10,p); canvas.drawRect(rect3,p); canvas.drawBitmap(image,90,10,p); } public boolean onTouchEvent(MotionEvent event){ super.onTouchEvent(event); x = event.getX(); //タッチしたX座標を得る。 y = event.getY(); //タッチしたY座標を得る。 if (rect.contains((int) x, (int) y)) { common.setNum(1); Log.v("dbg", String.valueOf( common.getNum() )); } else if (rect2.contains((int) x, (int) y)) { common.setNum(2); Log.v("dbg", String.valueOf( common.getNum() )); } if (rect3.contains((int) x, (int) y)) { common.setNum(3); Log.v("dbg", String.valueOf( common.getNum() )); } return false; } }

MainActivity.java

package com.example.*****.myapplication_teishutu; import android.content.res.AssetFileDescriptor; import android.media.AudioManager; import android.media.MediaPlayer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.IOException; public class MainActivity extends AppCompatActivity { private Button b, b2; private MediaPlayer mediaPlayer; TextView TextView; String string; private Common common; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); common = (Common) this.getApplication(); common.init(); TextView=(TextView) this.findViewById(R.id.textView); b = (Button) this.findViewById(R.id.button); //id が button であるボタン[Button]のオブジェクト b が生成される。 b2 = (Button) this.findViewById(R.id.button2); //id が button であるボタン[Button]のオブジェクト b が生成される。 } public void onClick() { setString(common.getNum()); TextView.setText(String.valueOf(common.getNum())); try { mediaPlayer = new MediaPlayer();;//音を読み込むためにMediaPlayer クラスのオブジェクトを定義 // assetsから mp3 ファイルを読み込み AssetFileDescriptor afdescripter = getAssets().openFd(string); //MediaPlayerに読み込んだ音楽ファイルを指定 mediaPlayer.setDataSource(afdescripter.getFileDescriptor(), afdescripter.getStartOffset(), afdescripter.getLength()); // 音量調整を端末のボタンに任せる setVolumeControlStream(AudioManager.STREAM_MUSIC); mediaPlayer.prepare(); // 再生する mediaPlayer.start(); } catch (IllegalStateException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } public void onClick2(View view) { try { mediaPlayer.stop(); }catch (IllegalStateException e){ e.printStackTrace(); } } public void setString( int i){ switch(i%4){ case 0: string = "c7.mp3"; Log.v("set",string.valueOf(common.getNum())); break; case 1: string = "n46.mp3"; Log.v("set",string.valueOf(common.getNum())); break; case 2: string = "n72.mp3"; Log.v("set",string.valueOf(common.getNum())); break; case 3: string = "n77.mp3"; Log.v("set",string.valueOf(common.getNum())); break; } } }

Common.java

package com.example.********.myapplication_teishutu; import android.app.Application; public class Common extends Application { private int num=0; public void setNum( int i){ this.num = i; } public int getNum(){ return num; } public void init(){ num=0; } }

###試したこと
値が変更された後にもう一度
common = (Common) this.getApplication();
を使わないといけないのかと思い、onClickの中で
common = (Common) this.getApplication();
を呼ばないといけないのかと思ってやってみたのですが、エラーになってアプリが閉じてしまいます

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

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

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

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

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

guest

回答1

0

ベストアンサー

MyView2を以下のように変更してみて下さい。おそらく動くはずです。

java

1public class MyView2 extends View { 2 private float x=0,y=0; 3 private Rect rect = new Rect(10,10,30,30) ; //衝突判定のターゲットを表す四角形 4 private Rect rect2 = new Rect(50,10,70,30) ; //衝突判定のターゲットを表す四角形 5 private Rect rect3 = new Rect(90,10,110,30) ; //衝突判定のターゲットを表す四角形 6 //private Common common = new Common(); ←ここでインスタンス化しない 7 private Common common; 8 private Bitmap image; //画像を読み込むためにBitmap クラスのオブジェクトを定義 9 10 11 public MyView2(Context context) { 12 super(context); 13 } 14 15 public MyView2(Context context, AttributeSet attrs) { 16 super(context, attrs); 17 18 Resources resource=getContext().getResources(); 19 image = BitmapFactory.decodeResource(resource,R.drawable.mugic); 20 common = (Common) getContext().getApplication(); //変更 21 22 } 23 24 @Override 25 protected void onDraw(Canvas canvas) { 26 27 super.onDraw(canvas); 28 29 Paint p= new Paint(); 30 canvas.drawRect(rect,p); 31 canvas.drawBitmap(image,10,10,p); 32 canvas.drawRect(rect2,p); 33 canvas.drawBitmap(image,50,10,p); 34 canvas.drawRect(rect3,p); 35 canvas.drawBitmap(image,90,10,p); 36 } 37 38 39 public boolean onTouchEvent(MotionEvent event){ 40 super.onTouchEvent(event); 41 42 43 x = event.getX(); //タッチしたX座標を得る。 44 y = event.getY(); //タッチしたY座標を得る。 45 46 if (rect.contains((int) x, (int) y)) { 47 common.setNum(1); 48 Log.v("dbg", String.valueOf( common.getNum() )); 49 } 50 else if (rect2.contains((int) x, (int) y)) { 51 common.setNum(2); 52 Log.v("dbg", String.valueOf( common.getNum() )); 53 } 54 if (rect3.contains((int) x, (int) y)) { 55 common.setNum(3); 56 Log.v("dbg", String.valueOf( common.getNum() )); 57 } 58 59 return false; 60 } 61}

投稿2017/01/07 09:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bigbox267

2017/01/07 12:56

やってみたところこんなエラーが出てきました E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.*****.myapplication_teishutu, PID: 2982 java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.*****.myapplication_teishutu.Common.setNum(int)' on a null object reference at com.example.******.myapplication_teishutu.MyView2.onTouchEvent(MyView2.java:64) at android.view.View.dispatchTouchEvent(View.java:9940) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810) at android.app.Activity.dispatchTouchEvent(Activity.java:3061) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:373) at android.view.View.dispatchPointerEvent(View.java:10160) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4434) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6313) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:323) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) MyView2 のタッチイベントが気に入らないみたいですが、何すればいいかいまいちわからないです
退会済みユーザー

退会済みユーザー

2017/01/07 13:02

Commonはマニフェストファイルに登録していますか? 登録していなのら、マニフェストファイルのapplicationないにandroid:name="Common"と追記して下さい。
bigbox267

2017/01/07 13:05

64だとちょうど common.setNum() のところですね。 null object referenceってことは インスタンスを生成していないから使えないってことですかね? コード上ではエラーになりませんが、画像のところをクリックすると上記のエラーが出てきます
bigbox267

2017/01/07 13:07

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.******.myapplication_teishutu"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" android:name=".Common"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> これであってますよね?
退会済みユーザー

退会済みユーザー

2017/01/07 13:25

マニフェストファイルは問題なさそうですね… あとで検証してみます。
bigbox267

2017/01/07 13:51

お手数おかけしてすみません。 あと、気になっているのが private Common common; この common が Private field 'common' is never assigned となっているのが気になりました。 だから、64行目でエラーになるのかなと思いました。
退会済みユーザー

退会済みユーザー

2017/01/07 15:14

MyView2の2つ目のコンストラクタ内に「common = (Common)context.getApplicationContext();」を追加してみてぐださい。
bigbox267

2017/01/08 05:47

おおー!! できましたー!! ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問