Kotlinでフラグメント
android.keicode.com を参考にKotlinに書き換えてみたものの、うまく行かず悩んでいたものがようやく実現できたのでメモ。
.javaの書き換え
引用元のコード
package com.keicode.android.test; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment1, container, false); } }
をKotlinにそのまま書き換えると以下のようになる。
package com.keicode.android.test import android.app.Fragment import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup class Fragment1 : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle): View? { return inflater.inflate(R.layout.fragment1, container, false) } }
コードをこのように書き換え、XMLは変更せず実行してみると動かない。
解決法
そこで、
を参考にFragment1.ktを以下のように書き換えた。
package com.keicode.android.test import android.support.v4.app.Fragment import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup public class Fragment1 : Fragment() { companion object { fun getInstance(): Fragment1 { return Fragment1() } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return inflater.inflate(R.layout.fragment1, container, false) } }
変更した点は2つ
import android.app.Fragment
をimport android.support.v4.app.Fragment
に変更
companion object { fun getInstance(): Fragment1 { return Fragment1() } }
を追加
これを両方のFragment.ktに対して変更することで、正しく動作するようになった。
おわりに
フラグメント関係はandroid.support.v4.app.Fragment
移ったのか。
でも、import android.app.Fragment
でもエラーはなく、コンパイルはできるし。
getInstance
は何をやってるメソッドなのか。
とかいろいろと気になる点はあれども、ひとまずはKotlinでフラグメントを実装することができた。
これらの疑問は追々調べていこう。
もしかしたら、無知の結果かもしくは元記事が2012年とかそこらなので、アップデートされていろいろと変わったのかもしれない。
手探り感がすごいので、しっかりと知識のある人に詳しく解説して貰いたいという気持ちが日に日に高まっていく。