LoginSignup
17
16

More than 5 years have passed since last update.

NavigationViewへのDataBindingについて

Last updated at Posted at 2016-06-19

あまり見当たらなかったのでメモしておきます。Kotlin環境です。

まずDesign Support Libraryの23.1.1が必要になるので、gradleに追加してください。
(NavigationViewからヘッダーを取り出すための getHeaderView メソッドが追加されています)

app.gradle
    compile 'com.android.support:design:23.1.1'

以下がNavigationViewの置いてあるActivityのレイアウトです。

activity_timeline.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">

        <include
            android:id="@+id/app_bar_timeline"
            layout="@layout/app_bar_timeline"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_timeline"
            app:menu="@menu/activity_timeline_drawer"/>

    </android.support.v4.widget.DrawerLayout>
</layout>

以下がNavigationViewのheaderレイアウトです。

nav_header_timeline.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="state"
            type="com.yonesukegames.tsubuyaki.domains.timeline.TimelineViewModel.State"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/nav_header_height"
        android:background="@drawable/side_nav_bar"
        android:gravity="bottom"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:theme="@style/ThemeOverlay.AppCompat.Dark">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="@dimen/nav_header_vertical_spacing"
            android:src="@android:drawable/sym_def_app_icon"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="@dimen/nav_header_vertical_spacing"
            android:text="@{state.me.name}"
            android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{state.me.screenName}"/>

    </LinearLayout>
</layout>

Activityのコードは以下です。

TimelineActivity.kt
class TimelineActivity : AppCompatActivity() {

    val binding by lazy {
        DataBindingUtil.setContentView<ActivityTimelineBinding>(this, R.layout.activity_timeline)
    }
    val viewModel by lazy { TimelineViewModel() }

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

        binding.navView.run {
            DataBindingUtil.bind<NavHeaderTimelineBinding>(getHeaderView(0))
            val headerBinding = DataBindingUtil.getBinding<NavHeaderTimelineBinding>(getHeaderView(0))
            headerBinding.state = viewModel.state
        }
    }
17
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
16