質問編集履歴

1 名前を伏せた

bigbox267

bigbox267 score 16

2017/01/07 21:58  投稿

AndroidStudioでのグローバル変数の受け渡しがうまくいかない
###前提・実現したいこと
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.j14047ri.myapplication_teishutu;
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();
を呼ばないといけないのかと思ってやってみたのですが、エラーになってアプリが閉じてしまいます
  • Java

    16163 questions

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

  • Android

    7404 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る