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

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

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

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2863閲覧

ViewGroup.addViewを使用してもViewが描画されません

JpTomari

総合スコア4

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/07/05 17:22

概要

Android StudioでAndroidアプリケーションを制作しております。
今回、ViewGroup.addViewを利用してViewを追加する処理を行ってみたのですが、子Viewが表示されません。

ソースコード

使用しているソースは以下の通りです。

Kotlin

1MainActivityクラス 2 3class MainActivity : AppCompatActivity() { 4 var mainView: MainView? = null; 5 var button: Button? = null; 6 7 override fun onCreate(savedInstanceState: Bundle?) { 8 super.onCreate(savedInstanceState) 9 setContentView(R.layout.activity_main) 10 11 mainView = this.findViewById(R.id.mainView) 12 mainView?.setActivity(this) 13 mainView?.setWillNotDraw(false) 14 mainView?.setBackgroundColor(Color.BLUE) 15 16 button = this.findViewById(R.id.button) 17 button?.setOnClickListener(mainView) 18 } 19}

Kotlin

1MainViewクラス 2 3class MainView : ViewGroup, View.OnClickListener { 4 val MP = ViewGroup.LayoutParams.MATCH_PARENT; 5 6 var parents: Activity? = null; 7 8 constructor(c: Context) : super(c) 9 { 10 } 11 constructor(c: Context, a: AttributeSet) : super(c, a) 12 { 13 } 14 15 fun setActivity(a: Activity) 16 { 17 parents = a 18 } 19 20 override fun onLayout(p0: Boolean, p1: Int, p2: Int, p3: Int, p4: Int) { 21 } 22 23 override fun onClick(p0: View?) { 24 var temp: ConstraintLayout = parents?.getLayoutInflater()?.inflate(R.layout.child_view, null) as ConstraintLayout 25 var textView: TextView = temp.findViewById(R.id.textView) 26 var params: ViewGroup.LayoutParams = ViewGroup.LayoutParams(MP, MP) 27 28 temp.setWillNotDraw(false) 29 textView.setWillNotDraw(false) 30 31 textView.setBackgroundColor(Color.GREEN) 32 textView.setTextColor(Color.RED) 33 textView.setText("test") 34 35 this.addView(temp, params) 36 } 37}

XML

1activity_main.xml 2 3<?xml version="1.0" encoding="utf-8"?> 4<androidx.constraintlayout.widget.ConstraintLayout 5 xmlns:android="http://schemas.android.com/apk/res/android" 6 xmlns:app="http://schemas.android.com/apk/res-auto" 7 xmlns:tools="http://schemas.android.com/tools" 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" 10 tools:context=".MainActivity"> 11 12 <LinearLayout 13 android:layout_width="match_parent" 14 android:layout_height="match_parent" 15 android:orientation="vertical" > 16 17 <Button 18 android:id="@+id/button" 19 android:layout_width="match_parent" 20 android:layout_height="wrap_content" 21 android:text="Button" /> 22 23 <com.example.kotlin_dmy.MainView 24 android:id="@+id/mainView" 25 android:layout_width="match_parent" 26 android:layout_height="match_parent" /> 27 </LinearLayout> 28</androidx.constraintlayout.widget.ConstraintLayout>

XML

1child_view.xml 2 3<?xml version="1.0" encoding="utf-8"?> 4<androidx.constraintlayout.widget.ConstraintLayout 5 xmlns:android="http://schemas.android.com/apk/res/android" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent"> 8 9 <TextView 10 android:id="@+id/textView" 11 android:layout_width="match_parent" 12 android:layout_height="match_parent" /> 13 14</androidx.constraintlayout.widget.ConstraintLayout>

想定している動作と現状

想定している動作としては、setContentViewによって親Viewを配置。
その親ViewにあるButtonを入力することで、MainViewにてchild_viewをinflateし、子ViewをaddViewする形です。

その際、親ViewのBackGroundColorを青、子ViewのBackGroundColorを緑としているのですが、画面は青のままとなっています。
処理そのものは正常に動作しており、各種インスタンスも生成されています。
よく指摘されるsetWillNotDrawもfalseに設定済みです。

なお、この現象はエミュレータ、実機双方で起こっている状態です。

何か他にも設定が足りないのでしょうか?
お気付きの点ございましたら、ご指摘、ご教授をお願いいたします。

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

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

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

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

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

hoshi-takanori

2021/07/05 22:32

ViewGroup の直接のサブクラスを作る場合、子ビューのレイアウト処理は全部自分で書く必要があったような…。 どんなレイアウトにしたいかにもよりますが、既存のものをそのまま (または継承して) 使う方がいいと思います。
JpTomari

2021/07/06 12:12

情報ありがとうございます。 こちらで引き続き検証を行った所、ViewGroupを継承したMainViewクラスにaddするのではなく、その下敷きとしているLinearLayoutにaddすることで、無事描画されました。 そちらのおっしゃる通り、どうも継承した独自クラスの場合は、まだ何らかの追加設定が必要な気がしますので、今回は大人しく既存クラスへのaddで処理を考えようと思います。
jimbe

2021/07/07 09:18

解決されたのでしたら、ご自分で回答を書き込んでベストアンサーとし、ご質問を終わらせてください。
guest

回答1

0

自己解決

自己解決いたしました。
上記activity_main内のmainViewを削除し、その下敷きとなっていたLinearLayoutに対してaddViewを行った場合は正常に描画出来ることが確認できました。
どうやらViewGroupを継承した独自クラスに対してのaddViewでは、描画が正常に行われない形のようです。

情報を提供してくださいました、hoshi-takanoriさま、本当にありがとうございました。

投稿2021/07/07 13:17

JpTomari

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問