DataBindingとActivityのコンストラクタ Layout Id指定を一緒に使う

JetpackのActivityとFragmentのコンストラクタに、Layout Idが指定できるようになりました。

これは、次のように使うことが出来ます。

class MainActivity : AppCompatActivity(R.layout.main_act)

class MainFragment : Fragment(R.layout.main_frag)

Activityの場合は、setConentViewが。Fragmentの場合はonCreateViewがそれぞれ省略することが出来ます。

ここからが本題です。これをDataBindingと一緒に使うなら、次のようになるかなと思います。

Activityの場合

まずはActvityの例です。

// 拡張関数を定義しておく
fun <T : ViewDataBinding> ComponentActivity.bindView(): T =
  DataBindingUtil.bind(getContentView())!!

private fun Activity.getContentView(): View =
  findViewById<ViewGroup>(android.R.id.content)[0]


// MainActivity.kt
class MainActivity : AppCompatActivity(R.layout.main_act) {
  private lateinit var binding: MainActBinding

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = bindView()
    ...
  }
}

また、Activityの場合に限り、by lazyと組み合わせることも可能です。

class MainActivity : AppCompatActivity(R.layout.main_act) {
  private val binding by lazy { bindView<MainActBinding>() }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
  }
}

Fragmentの場合

次にFragmentの例になります。

// 拡張関数を定義しておく
fun <T : ViewDataBinding> Fragment.bindView(): T = DataBindingUtil.bind(view!!)!!


// MainFragment.kt
class MainFragment : Fragment(R.layout.main_frag) {
  private lateinit var binding: MainFragBinding

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    binding = bindView()
    ...
  }
}

Kotlinの拡張関数でやるなら、こんな感じになると思ってます。

まとめ


内容におかしい点や、もっとこうしたほうがいいよって!!いうのがあればTwitterなどから教えてもらえればとても嬉しいです😊

Written by