私が作ったプログラムの流れを書きます。
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));
}
}
あなたの回答
tips
プレビュー