Skip to content

Instantly share code, notes, and snippets.

@mochico
Forked from wasabeef/AAC-ViewModel-Codelabs.md
Created February 22, 2018 11:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mochico/b627c8b18ed4ba60b704f488ca74b80e to your computer and use it in GitHub Desktop.
Save mochico/b627c8b18ed4ba60b704f488ca74b80e to your computer and use it in GitHub Desktop.
ViewModel - Android Architecture Components

ViewModel - Android Architecture Components

Android Architecture Components 勉強会 #3
https://gdg-tokyo.connpass.com/event/79370/

課題一覧

Empty Activity で新しい Kotlin プロジェクトを作ろう
※(パッケージ名は com.sample.viewmodel を想定)

apply plugin: 'kotlin-kapt'
// ...
dependencies {
    implementation "com.android.support:appcompat-v7:27.0.2"
    // ...
    implementation "android.arch.lifecycle:extensions:1.1.0"
    kapt "android.arch.lifecycle:compiler:1.1.0"
}

ViewModel を継承した UserViewModel に書き換えよう

class UserViewModel {

    private var user: User? = null

    fun getUser(): User? {
        if (user == null) {
            load()
        }
        return user
    }

    private fun load() {
        user = User("Hanyu", 23)
    }
}
data class User(val name: String, val age: Int)

継承したUserViewModelをActivity内で使ってみよう

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val user = UserViewModel()
        Log.d("OLYMPICS", user.getUser()?.toString())
    }
}

Fragment 内で userA/B/C が同じか確認しよう

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

    val userA = ViewModelProviders.of(this).get(UserViewModel::class.java)

    val userB = ViewModelProviders.of(activity!!).get(UserViewModel::class.java)

    val userC = ViewModelProviders.of(this).get(UserViewModel::class.java)
  }
}

2つのFragment 内で user が同じか確認しよう

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

    val user = ViewModelProviders.of(this).get(UserViewModel::class.java)
  }
}
class BottomFragment : Fragment() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val user = ViewModelProviders.of(this).get(UserViewModel::class.java)
  }
}
@mochico
Copy link
Author

mochico commented Feb 22, 2018

package com.example.mochico.aac_viewmodel

import android.arch.lifecycle.MutableLiveData
import android.arch.lifecycle.ViewModel
import android.arch.lifecycle.ViewModelProviders
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val user = UserViewModel()
        Log.d("OLYMPICS", System.identityHashCode(user).toString()) // ViewModelProvidersをつかってないので再生成される

        supportFragmentManager.beginTransaction().add(DogFragment(), "Dog").commit()

        // TopとBottomの持つUserViewModelのインスタンスは異なる
        supportFragmentManager.beginTransaction().add(TopFragment(), "Top").commit()
        supportFragmentManager.beginTransaction().add(BottomFragment(), "Bottom").commit()
    }

    class DogFragment : Fragment() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val userA = ViewModelProviders.of(this).get(UserViewModel::class.java)
            Log.d("userA", System.identityHashCode(userA).toString())
            Log.d("userA", userA.toString())
            val userB = ViewModelProviders.of(activity!!).get(UserViewModel::class.java)
            Log.d("userB", System.identityHashCode(userB).toString())
            Log.d("userB", userB.toString())
            val userC = ViewModelProviders.of(this).get(UserViewModel::class.java)
            Log.d("userC", System.identityHashCode(userC).toString())
            Log.d("userC", userC.toString())
            // AとCは同じ、Bは違うインスタンス
        }
    }

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

            val user = ViewModelProviders.of(this).get(UserViewModel::class.java)
            Log.d("top user", user.toString())
        }
    }
    class BottomFragment : Fragment() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)

            val user = ViewModelProviders.of(this).get(UserViewModel::class.java)
            Log.d("bottom user", user.toString())
        }
    }

    class UserViewModel : ViewModel() {

        private var user: MutableLiveData<User>? = null

        fun getUser() {
            if (user == null) {
                user = MutableLiveData()
                load()
            }
        }

        private fun load() {
            user?.postValue(User("Hanyu", 23))
        }
    }
    data class User(val name: String, val age: Int)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment