前提・実現したいこと
お絵かきアプリにボタンを追加したい
発生している問題・エラーメッセージ
xmlでMyView.javaを動かしたいです。ビルドは成功するのですが、runするとアプリが一瞬で落ちてしまいます。xmlの<com.example.DrawingApp.MyView〜/>を消し、MainActivity.javaでsetContentView(R.layout.activity_main);とするとボタンだけ表示され、正しく動作します。また、MainActivity.javaでsetContentView(new MyView(this));とすると描画が正しく動作します。xmlに2,3の引数が使われていないとのメッセージがあるのですがどうしたらいいかわかりません。
Custom view MyView is not using the 2- or 3-argument View constructors; XML attributes will not work
該当のソースコード
java
1activity_main.xml 2<Button 3 android:id="@+id/button" 4 android:layout_width="wrap_content" 5 android:layout_height="wrap_content" 6 android:text="@string/button" 7 app:layout_constraintBottom_toBottomOf="parent" 8 app:layout_constraintLeft_toLeftOf="parent" 9 app:layout_constraintRight_toRightOf="parent" 10 app:layout_constraintTop_toTopOf="parent" /> 11 12 <com.example.DrawingApp.MyView 13 android:layout_width="340dp" 14 android:layout_height="420dp" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintLeft_toLeftOf="parent" 17 app:layout_constraintRight_toRightOf="parent" 18 app:layout_constraintTop_toTopOf="parent" />
java
1MyView.java 2public class MyView extends View { 3 // イべント発生時の X 座標、Y 座標を保存するための動的配列 4 private ArrayList array_x, array_y; 5 private ArrayList array_status; 6 // コンストラクタ 7 public MyView(Context context){ 8 super(context); 9 array_x = new ArrayList(); 10 array_y = new ArrayList(); 11 array_status = new ArrayList(); 12 } 13 // ビューの描画を行うときに呼ばれるメソッド 14 @Override 15 protected void onDraw(Canvas canvas){ 16 super.onDraw(canvas); 17 // 背景を白色で塗りつぶす 18 Paint paint = new Paint(); 19 paint.setStyle(Paint.Style.FILL); 20 paint.setColor(Color.WHITE); 21 canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint); 22 // 描画用の Paint オブジェクトを用意 23 paint = new Paint(); 24 paint.setStyle(Paint.Style.STROKE); 25 paint.setColor(Color.RED); 26 // 配列内の座標を読み出して線(軌跡)を描画 27 for (int i = 1; i < array_status.size(); i++) { 28 // 描画するように(true)状態値が与えられているとき 29 // 一度離してしてから次に押されるまでの移動分は描画しない 30 if ((Boolean) array_status.get(i)) { 31 // 開始点の終了点の座標の値を取得 32 int x1 = (Integer) array_x.get(i - 1); 33 int x2 = (Integer) array_x.get(i); 34 int y1 = (Integer) array_y.get(i - 1); 35 int y2 = (Integer) array_y.get(i); 36 // 線を描画 37 canvas.drawLine(x1, y1, x2, y2, paint); 38 } 39 } 40 } 41 @Override 42 public boolean onTouchEvent(MotionEvent event) { 43 //return super.onTouchEvent(event); 44 // 座標を取得 45 int x = (int)event.getX(); 46 int y = (int)event.getY(); 47 // イベントに応じて動作を変更 48 int a = event.getAction(); 49 switch (a) { 50 case MotionEvent.ACTION_DOWN: //タッチパネルが押された時 51 case MotionEvent.ACTION_POINTER_DOWN: 52 array_x.add(new Integer(x)); // 座標を配列に保存 53 array_y.add(new Integer(y)); 54 array_status.add(new Boolean(false));// 線の描画はしない(false) 55 invalidate();// 画面を強制的に再描画 56 break; 57 case MotionEvent.ACTION_MOVE: 58 array_x.add(new Integer(x)); // 座標を配列に保存 59 array_y.add(new Integer(y)); // 線の描画をする(true) 60 array_status.add(new Boolean(true)); 61 invalidate(); // 画面を強制的に再描画 62 break; 63 case MotionEvent.ACTION_UP: // タッチパネルから離れたとき 64 case MotionEvent.ACTION_POINTER_UP: 65 array_x.add(new Integer(x)); // 座標を配列に保存 66 array_y.add(new Integer(y)); // 線の描画をする(true) 67 array_status.add(new Boolean(true)); 68 invalidate(); // 画面を強制的に再描画 69 break; 70 } 71 return true; 72 } 73} 74
回答1件
あなたの回答
tips
プレビュー