🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Android

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

Kotlin

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

Q&A

解決済

1回答

1247閲覧

Android(Kotlin)でカスタムのトーストビューの作成ができません

afterhiroshima

総合スコア6

Android

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

Kotlin

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

0グッド

0クリップ

投稿2019/12/18 08:59

編集2019/12/18 10:45

前提・実現したいこと

Androidのdevelopersドキュメントのトーストの概要
で紹介されていますカスタムのトーストビューの作成をKotlinで書いています。カスタマイズしたトーストを表示しようとするとソースコード「val container: ViewGroup = findViewById(R.id.custom_toast_container) 」の行を実行時に、下記の「問題が発生したため・・・」というエラーメッセージがスマホの実機に表示されてしまいます。この原因と対策方法をご教示ください。

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

「問題が発生したため○○アプリを終了します」 Logcatで表示されたエラーメッセージは以下になります。 12-18 18:14:10.474 8847-8847/com.cosmoserv.listviewsample E/AndroidRuntime: FATAL EXCEPTION: main Process: com.cosmoserv.listviewsample, PID: 8847 java.lang.IllegalStateException: findViewById(R.id.custom_toast_container) must not be null at com.cosmoserv.listviewsample.MainActivity$ListItemClickListener.onItemClick(MainActivity.kt:30) at android.widget.AdapterView.performItemClick(AdapterView.java:310) at android.widget.AbsListView.performItemClick(AbsListView.java:1188) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3231) at android.widget.AbsListView$3.run(AbsListView.java:4165) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5637) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)

該当のソースコード

xml

1(layout/custom_toast.xml として保存) 2<?xml version="1.0" encoding="utf-8"?> 3<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 android:id="@+id/custom_toast_container" 6 android:orientation="horizontal" 7 android:layout_width="fill_parent" 8 android:layout_height="fill_parent" 9 android:padding="8dp" 10 android:background="#DAAA" 11 > 12 13 <ImageView 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:layout_marginRight="8dp" 17 app:srcCompat="@mipmap/ic_launcher" /> 18 <TextView android:id="@+id/text" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:textColor="#FFF" 22 /> 23</LinearLayout>

Kotlin

1 //リストがタップされた時の処理が記述されたメンバクラス。 2 private inner class ListItemClickListener : AdapterView.OnItemClickListener { 3 override fun onItemClick(parent: AdapterView<*>, view1: View, position: Int, id: Long) { 4 //カスタムトーストビューの表示。 5 val inflater = layoutInflater 6 val container: ViewGroup = findViewById(R.id.custom_toast_container) //←ここで問題が発生。 7 val layout: View = inflater.inflate(R.layout.custom_toast, container) 8 val text: TextView = layout.findViewById(R.id.text) 9 text.text = "This is a custom toast" 10 with (Toast(applicationContext)) { 11 setGravity(Gravity.CENTER_VERTICAL, 0, 0) 12 duration = Toast.LENGTH_LONG 13 view = layout 14 show() 15 } 16 } 17 }

試したこと

ドキュメントで紹介されているサンプルコードとほとんど、同じコーディングにしています。Android Studioで指摘されたエラー(ViewGroupをViewに変更など)は修正しています。
Android Studioのデバッガでステップ実行すると、いつも上記の行でエラーになります。

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

Language : Kotlin
Minimum API level :API 15: Android 4.0.3 (IceCreamSandwich)

Android Studio 3.5.2
JRE: 1.8.0_202-release-1483-b03 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

スマホ実機 機種
Plus One Japan Limited FTJ152A
Androidバージョン 5.1

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/12/18 10:32

エラーが書いてませんが
afterhiroshima

2019/12/18 10:46

失礼しました。エラーメッセージを追記しました。
guest

回答1

0

ベストアンサー

これはまあサンプルが悪いですね…(JavaをそのままKotlinに変換しただけっぽい?)

Kotlin

1val container: ViewGroup = findViewById(R.id.custom_toast_container) 2val layout: View = inflater.inflate(R.layout.custom_toast, container)

ここで見ている R.id.custom_toast_container は、その次の行でインフレートしている R.layout.custom_toast のビューなので、
エラー内容からMainActivityのfindViewByIdを使っているものと思われますが、
まだインスタンス化もしていないビューをfindViewByIdしても取得できないし、そもそもActivityのfindViewByIdで探しに行っているのはActivityのレイアウト内のビューなので、例え既にビューがあったとしても見つかりっこないのです。

それで、LayoutInflater#inflateの第2引数はnullでも動く (大雑把に言うと、第1引数で指定したレイアウトを突っ込む親ビューを指定するので、無ければnullでいい)ので、該当行を消して

Kotlin

1val layout: View = inflater.inflate(R.layout.custom_toast, null)

だけで動きます。
(つまり、余談ですが、実はJavaのサンプルもおかしいという…)

投稿2019/12/18 12:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

afterhiroshima

2019/12/19 06:32

早速のご回答ありがとうございました。指摘されたとおりに修正しましたら無事に動作しました。Kotlin初学者にとって丁寧な解説も頂けてとても助かります。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問