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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Android Studio

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

Q&A

0回答

453閲覧

画面遷移をしているとsurfaceview内でエラーが起こります。

montai

総合スコア6

Android Studio

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

0グッド

0クリップ

投稿2018/02/11 13:31

私が作ったプログラムの流れを書きます。
MaintActivityのeditTextに入力された値を画面遷移したクラス(SubActivity)に渡します。その値でSubAcitvityのsurfaceview内で点を描画します。SubActivity内のbuttonを押すことで,SubActivity内のedittextに入力された値に応じてsurfaceview内で点を再描画します。

問題点は,MainActivityとSubActivity間を何回か画面遷移していると, アプリが終了します。その時のログをみるとunlockCanvasAndPost()のところでエラーが出ていると書かれていました。

アプリが終了しないようにすればどうすればいいでしょうか。
解決方法が分かる方がいましたら,よろしくお願いします。

下記に,私が作ったプログラムを全て載せます。

public class MainActivity extends AppCompatActivity {
EditText edit1,edit2;
int x_zahyo=0,y_zahyo=0;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit1 = (EditText)findViewById(R.id.editText);
edit2 = (EditText)findViewById(R.id.editText2);
}

public void map1_Button(View v){ if(edit1.getText().toString().equals("")) x_zahyo = 0; else x_zahyo = Integer.parseInt(edit1.getText().toString()); if(edit2.getText().toString().equals("")) y_zahyo = 0; else y_zahyo = Integer.parseInt(edit2.getText().toString()); Intent intent = new Intent(this,SubActivity.class); intent.putExtra("x",x_zahyo); intent.putExtra("y",y_zahyo); startActivity(intent);

}
}

public class SubActivity extends AppCompatActivity{
private AnimationSurfaceView animationSurfaceView;
SurfaceView surfaceView;
EditText edit1,edit2;
int x,y;

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Intent intent = getIntent();
x = intent.getIntExtra("x", 0);
y = intent.getIntExtra("y", 0);
surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
edit1 = (EditText)findViewById(R.id.editText5);
edit2 = (EditText)findViewById(R.id.editText6);

animatinonSurfaceView = new AnimationSurfaceView(this,surfaceview,x,y);

}

public void finish(View v){ finish(); }

public void button(View v){
int x1=0,y1=0;
if(edit1.getText().toString().equals("")) x1=0; else x1=Integer.parseInt(edit5.getText().toString());
if(edit2.getText().toString().equals("")) y1=0; else y1=Integer.parseInt(edit5.getText().toString());
animationSurfaceView.get_zahyo(x1,y1);
}
}

public class AnimationSurfaceView extends SurfaceView implements Runnable,SurfaceHolder.Callback,SensorEventListener{

private SurfaceHolder surfaceHolder; private Thread thread; private Bitmap bitmapImage; int x_zahyo,y_zahyo; private static final String TAG = "MainSurfaceView";

public AnimationSurfaceView(Context context, SurfaceView sv,int x, int y){
super(context);
this.surfaceHolder = sv.getHolder();
this.surfaceHolder.addCallback(this);
x_zahyo = x;
y_zahyo = y;
}

@Override public void surfaceCreated(SurfaceHolder holder) { thread = new Thread(this); thread.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d(TAG,"surfaceChanged"); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG,"surfaceDestroyed"); thread = null; } @Override public void run() { Log.d(TAG,"run"); while(thread!=null) Draw(); }

public void Draw(){
Paint paint = new Paint();
paint.setColor(Color.Blue);
Canvas c = this.surfaceHolder.lockCanvas();
if(c!=null){
c.drawPoint(x_zahyo,y_zahyo,paint);
this.surfaceHolder.unlockCanvasAndPost(c);
}
}

public void get_zahyo(int x1, int y1){
x_zahyo=x1;
y_zahyo=y1;
Log.d("",String.valueOf(x_zahyo));
}
}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問