怠慢プログラマーの備忘録

怠慢でナマケモノなプログラマーの備忘録です。

【Kotlin】FragmentのListViewをActivityで呼び出す

表示領域を確保

activity_main_list.xmlをConstraintLayoutで見ると以下のようになっています。

f:id:ka0in:20180317013723p:plain - 表示させたい領域にFrameLayoutを追加 - FrameLayoutのIDを設定(例ではframeIDとしています)

Fragmentを追加

fragment_main_list.xmlをConstraintLayoutで見ると以下のようになっています。 f:id:ka0in:20180317014148p:plain

  • fragment_main_list.xmlにListViewを追加
  • ListVIewのIDを設定(例ではlistViewIDとしています)

MainListFragment.kt

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ListView

class MainListFragment : Fragment() {

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

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        val mainFrame = inflater!!.inflate(R.layout.fragment_main_list, container, false)
        val listView = mainFrame.findViewById(R.id.listViewID) as ListView
        val dataArray = arrayOf("kotlin", "Android", "Swift", "iOS")
        val adapter = ArrayAdapter<String>(this.context, android.R.layout.simple_list_item_1, dataArray)
        listView.adapter  = adapter
        return mainFrame
    }

}

ポイントはfindViewByIdの前に変数mainFrameにMainListActivityのFrameLayoutのインスタンスを挿入しています。 また、戻り値もそのmainFrameを返却します。

MainListActivityからFragmentを呼び出す

MainListActivity.kt

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.design.widget.TabLayout

class MainListActivity : AppCompatActivity() {

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

        this.setActionBar()
        this.replaceFragment()
    }

    // MARK: - Privates
    private fun setActionBar() {
        supportActionBar?.title = "新潟永住計画"
        supportActionBar?.setIcon(R.mipmap.h_logo)
        // ActionBarの影をなくす
        supportActionBar?.elevation = 0F
        supportActionBar?.setDisplayShowHomeEnabled(true)
    }

    private fun replaceFragment() {
        val transaction = supportFragmentManager.beginTransaction()
        val mainFragment = MainListFragment()
        transaction.replace(R.id.frameID, mainFragment)
        transaction.commit()
    }

}
  • supportFragmentManagerbeginTransaction()でtransactionを生成
  • replaceのパラメータに表示領域のframeIDとMainListFragmentのインスタンスを渡して.commit()transaction.add()でもいいのですが、.replaceはFragmentが存在しない場合はaddし、既に存在する場合はremoveしてaddするので基本replaceでいい。

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

Androidアプリ開発のためのKotlin実践プログラミング

Androidアプリ開発のためのKotlin実践プログラミング

黒帯エンジニアが教えるプロの技術 Android開発の教科書(ヤフー黒帯シリーズ)

黒帯エンジニアが教えるプロの技術 Android開発の教科書(ヤフー黒帯シリーズ)