blitz-time アプリ開発ブログ

Androidアプリ開発などのTips集

【Kotlin入門】Smart cast to '***' is impossible, because '***' is a complex expression.

「はじめてのAndroidプログラミング」でフラグメントの勉強中です。現在、第8章の「フラグメントを使ったスライドショーアプリ」に取り組み中。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        pager.adapter = MyAdapter(supportFragmentManager)

        val handler = Handler()
        timer(period = 5000){
            handler.post{
                pager.currentItem = (pager.currentItem + 1) % 10
            }
        }
    }

    class MyAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm){
        private val resources = listOf(
            R.mipmap.homberg,  R.mipmap.ocean,
            R.mipmap.tree,R.mipmap.tree2,R.mipmap.tree3
        )

        override fun getItem(position: Int): Fragment {
            return ImageFragment.newInstance(resources[position])
        }

        override fun getCount(): Int {
            return resources.size
        }
    }
}

指示されたコードはこんな感じです。しかし少し気になるところがあります。

pager.currentItem = (pager.currentItem + 1) % 10

の箇所ですね。「%10」って数量が固定されている。スライドショーの写真の枚数が入るべきところですが、固定になっている。これはプログラム的にはよろしくないですね。「resources」に写真を追加すると枚数変わりますし。

写真枚数のところは写真の配列の数を指定すべきなので、

pager.currentItem = (pager.currentItem + 1) % pager.adapter.count

としましたが、「Smart cast to 'MainActivity.MyAdapter' is impossible, because 'pager.adapter' is a complex expression.」というエラーが出てしまいます。はて?
f:id:mfblitz:20200621161555p:plain

赤ヒントが出てますね。

f:id:mfblitz:20200621160716p:plain

「Cast expression 'pager.adapter' to 'MainActivity.MyAdapter'」という修正候補が出ています。

f:id:mfblitz:20200621160739p:plain

これを実行すると、

pager.currentItem = (pager.currentItem + 1) % (pager.adapter as MyAdapter).count

こうなります。つまり明示的にキャストしてやればいいのか。。。

派生元クラスのFragmentPagerAdapterにcount用のメソッドであるgetCount()が実装されていると思ったのですが、そうではなかったようです。MyAdapterでしか実装していないので、FragmentPagerAdapterのままではアクセスできないのですね。フムフム。。。

次行ってみよう!!

appdev.blitz-time.com
appdev.blitz-time.com