「はじめてのAndroidプログラミング」でフラグメントの勉強中です。現在、第7章の「フラグメントで動物ずかんを作ろう」に取り組み中。
ActivityからFragmentから派生したTitleFragmentのインスタンスを取得して、メソッドを実行するのですが、実行時に「Caused by: kotlin.TypeCastException: null cannot be cast to non-null type ***.TitleFragment」という例外が発生します。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val fragment = titleFragment as TitleFragment fragment.setTitle("フラグメントタイトル") } }
nullはnon-nullであるTitleFragmentにはキャストできないという事です。
正解は、
val fragment = titleFragment as? TitleFragment fragment?.setTitle("フラグメントタイトル")
でした。「as?(安全キャスト演算子)」です。「型が一致すればキャストを行い、一致しなければnullを返す。」というもので、もちろんnullが返ってくる場合がありますので、fragmentを利用する場合にも「fragment?」としなければなりません。
まだまだ修行が足りません。
で、実行すると、
あれ、変わっていない。
そもそも始めにに「nullはキャストできない」というエラーだったわけで、それは「titleFragment」が「null」、つまり存在しないという事ですね。
よく見ると、Fragmentのidが「fragment」になっていました。
これを「titleFragment」に修正したところ、タイトルが変更されました。
いけました!
次行ってみよう!!
appdev.blitz-time.com
appdev.blitz-time.com
appdev.blitz-time.com
appdev.blitz-time.com