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

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

ただいまの
回答率

87.93%

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

受付中

回答 0

投稿

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

score 6

私が作ったプログラムの流れを書きます。
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));
}
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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