一覧から詳細の起動 – ParcelableなインスタンスをIntentに付与してActivityを起動する

記事一覧画面でアイテムを触るとそのアイテムの詳細画面が開くというのをやりたい。
記事詳細画面のController(Activity)を書く。

Intent

まずIntent。Activityを起動する際にパラメタの役割を果たす。
Intentには「意図」「目的」の意味がある。Activityを起動する意図とか目的とか。
ベースとなるIntentに付加的な情報を付与(putExtra)することで「意図」「目的」となる。

Intentには基本型の他にカスタムオブジェクトを付与することができる。
ただし、カスタムオブジェクトはParcelableインターフェースを実装している必要がある。

あるActivityから別のActivityを起動する際のテクニックとして、
起動される側のActivityが持つintent()メソッドを使ってIntentを作成し(つまりパラメタを渡し)、
作成したIntent経由でActivityを起動する。

companionオブジェクトにfun intent(context: Context, article: Article): Intentを作る。
このintent()を経由すれば起動に必要なパラメタ(今回はarticle: Article)を付与したIntentを取得できる。
intent()内ではputExtra()を使ってarticleとIntentを紐づけている。

onCreate(savedInstanceState: Bundle?)

onCreate()が発火したときにはIntentにParcalableなArticleインスタンスが付与済み。
Activityが持つintentからgetParcelableExtra()によりArticleインスタンスを取得して、
ビューにそのArticleインスタンスを表示する。


package com.example.ikuty.myapplication

import android.content.Context
import android.content.Intent
import android.os.Bundle

import android.support.v7.app.AppCompatActivity
import android.webkit.WebView
import com.example.ikuty.myapplication.model.Article
import com.example.ikuty.myapplication.view.ArticleView

class ArticleActivity: AppCompatActivity() {
    companion object {
        private const val ARTICLE_EXTRA: String = "article"
        fun intent(context: Context,article: Article): Intent =
                Intent(context, ArticleActivity::class.java)
                        .putExtra(ARTICLE_EXTRA, article)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_article)
        val articleView = findViewById(R.id.article_view) as ArticleView
        val webView = findViewById(R.id.web_view) as WebView
        val article: Article = intent.getParcelableExtra(ARTICLE_EXTRA)
        articleView.setArticle(article)
        webView.loadUrl(article.url)
    }
}