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

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

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

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

Android Studio

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

Q&A

解決済

1回答

939閲覧

お絵かきアプリ android studio

1236

総合スコア19

Android

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

Android Studio

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

0グッド

0クリップ

投稿2020/05/19 11:06

前提・実現したいこと

お絵かきアプリにボタンを追加したい

発生している問題・エラーメッセージ

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

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

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

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

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

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

keicha_hrs

2020/05/19 13:26

activity_main.xmlはConstraintLayoutなどで囲っているのでしょうか?それも省略せずご提示いただきたいです。
1236

2020/05/19 13:37 編集

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <com.example.DrawingApp.MyView android:id="@+id/myView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> ご回答ありがとございます。
keicha_hrs

2020/05/19 14:17

すでに回答が出ていますが、MyViewのコンストラクターを引数2つのものに置き換えれば解決できるようですね。
1236

2020/05/19 14:51

それで解決できました。ご回答ありがとうございました!
guest

回答1

0

ベストアンサー

カスタムビューのコンストラクタは、引数が 1 〜 4 個の 4 種類 (そのうち、引数が 4 個のものは API level 21 以上) があって、layout XML に配置するには引数が 2 個のものが必要なようです。
参考: ビュークラスを作成する | Android デベロッパー | Android Developers

java

1public class MyView extends View { 2 3 public MyView(Context context, AttributeSet attrs) { 4 super(context, attrs); 5 6 // ここに初期化コードを書く。 7 } 8}

一般的にはコンストラクタを 3 つ (または 4 つ) 書いてる例が多いですが、正直どこまで必要なのかはよく知りません。
参考: Guide to Android custom views: constructors - Marcin Korniluk - Medium
参考: Viewの4つのコンストラクタ - Qiita

java

1public class MyView extends View { 2 3 public MyView(Context context) { 4 super(context); 5 init(); 6 } 7 8 public MyView(Context context, AttributeSet attrs) { 9 super(context, attrs); 10 init(); 11 } 12 13 public MyView(Context context, AttributeSet attrs, int defStyleAttr) { 14 super(context, attrs, defStyleAttr); 15 init(); 16 } 17 18 private void init() { 19 // ここに初期化コードを書く。 20 } 21}

投稿2020/05/19 13:51

hoshi-takanori

総合スコア7901

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

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

1236

2020/05/19 14:52

正しく動作しました。ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問