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

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

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

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

Q&A

解決済

1回答

586閲覧

AndroidのカスタムViewを貼り付けたい

soma62jp

総合スコア141

Android

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

0グッド

0クリップ

投稿2020/06/04 19:22

編集2020/06/04 19:47

前提・実現したいこと

AndroidのViewをカスタムして、Activityに表示させたいのですが、
全面に表示されてしまいます。

①上半分とか、相対位置を指定して表示することは可能でしょうか?
②作成したクラスにメソッドを追加して、背景の色を変化させることは可能でしょうか?

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

カスタムViewが全面表示されてしまう

該当のソースコード

activity_main.xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 10 <View 11 android:id="@+id/view1" 12 android:layout_width="0dp" 13 android:layout_height="0dp" 14 android:layout_marginBottom="500dp" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintEnd_toEndOf="parent" 17 app:layout_constraintStart_toStartOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20</androidx.constraintlayout.widget.ConstraintLayout>

java

1package com.example.myapplication; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.os.Bundle; 6 7public class MainActivity extends AppCompatActivity { 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 // ① MyViewのインスタンスを生成. 15 MyView mView = new MyView(this); 16 17 // ② mViewをWindowに貼り付け. 18 setContentView(mView); 19 } 20}

java

1package com.example.myapplication; 2 3import android.content.Context; 4import android.graphics.Canvas; 5import android.graphics.Color; 6import android.view.View; 7 8/** 9 * 描画用のクラス. 10 */ 11class MyView extends View { 12 13 /** 14 * コンストラクタ. 15 * 16 * @param context コンテキスト 17 */ 18 public MyView(Context context) { 19 super(context); 20 setFocusable(true); 21 22 } 23 24 /** 25 * 描画処理を行う. 26 */ 27 @Override 28 protected void onDraw(Canvas canvas ) { 29 super.onDraw(canvas); 30 31 // 背景色を設定 32 canvas.drawColor(Color.BLUE); 33 34 } 35}

試したこと

上記のコードでViewが全面表示されてしまう

補足情報(FW/ツールのバージョンなど)

Android Studio 4.0.0
API 28

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

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

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

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

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

guest

回答1

0

ベストアンサー

一般的に、「set」と言えば前に「set」されたものは上書きされます。
ですので、「setContentView(R.layout.activity_main)」とした後に「setContentView(mView)」とすれば、前に呼んだものは無くなります。
つまり、MyViewが大きさの指定無しで作成された状態になります。

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 10 <com.example.myapplication.MyView 11 android:id="@+id/view1" 12 android:layout_width="0dp" 13 android:layout_height="0dp" 14 android:layout_marginBottom="500dp" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintEnd_toEndOf="parent" 17 app:layout_constraintStart_toStartOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20</androidx.constraintlayout.widget.ConstraintLayout>

というように、XMLファイルに「パッケージ名+クラス名」でカスタムViewを指定できますので、後はソースコードで「setContentView(R.layout.activity_main)」だけ呼び出せばよいでしょう。


あ、質問に対する回答を書いてなかったわ。
とは言うものの、時間がないので適当になりますが。

①上半分とか、相対位置を指定して表示することは可能でしょうか?

なんかXMLでの指定はわかってらっしゃるようなので、上記を参考にXMLにカスタムViewを書いて指定してみてはいかがですか。

②作成したクラスにメソッドを追加して、背景の色を変化させることは可能でしょうか?

上記はTextViewですが、Viewを継承していればどれも一緒です。


の方法だと、あらかじめメソッドに記述されているコードでしか背景色が変わりません。
②のメソッドを引数付きでMainActivityから呼び出して、任意の色に変更したいのですが。。

微妙に理解できないのですが、こういうことですか。

java

1// 一部省略してます。 2public class MainActivity extends AppCompatActivity 3{ 4 @Override protected void onCreate(Bundle savedInstanceState) 5 { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 9 MyView view = (MyView)this.findViewById(R.id.view1); 10 /* 11 わざわざメソッドを作らなくても背景色を変えるだけならばこれでいいはずですが 12 view.setBackgroundColor(Color.BLUE); 13 */ 14 // あえてメソッドを作る理由があるのであれば 15 view.setMyColor(Color.BLUE); 16 } 17}

java

1// 一部省略してます。 2public class MyView extends View 3{ 4 int mColor; 5 6 @Override 7 protected void onDraw(Canvas canvas) 8 { 9 super.onDraw(canvas); 10 11 canvas.drawColor(mColor); 12 } 13 14 public void setMyColor(int color) 15 { 16 mColor = color; 17 // 基本的にすぐにはonDrawを呼んでくれないので、呼んでもらえるようにする。 18 invalidate(); 19 } 20}

投稿2020/06/04 23:12

編集2020/06/05 14:33
katsuko

総合スコア3471

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

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

soma62jp

2020/06/05 02:18

その方法だと、あらかじめメソッドに記述されているコードでしか背景色が変わりません。 ②のメソッドを引数付きでMainActivityから呼び出して、任意の色に変更したいのですが。。 やり方をご存じでしたら、教えて頂ければ幸いです。
soma62jp

2020/06/05 17:22

katsukoさんの解釈であっています。 ただ、コンパイルは通るのですが、私の環境では、実行時にエラーで落ちます。 ①そもそもできない ②やり方が間違っている このどちらかを知りたいです。
katsuko

2020/06/06 00:54

私のところでは問題なく動いています。 ご自身でデバッグして調べてみてください。
soma62jp

2020/06/06 02:10

私の手元ではまだ再現できていませんが、上記方法で実現可能との認識、承知致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問