Fragment 間の遷移 (2) Fragmentの切り替へ

2019年12月15日日曜日

t f B! P L

概要

 2つの Fragment で画面を切り替へるアプリケーションを作る前回のつづき。今回は、第二の Fragment を作り、画面を切り替へるまで。

 使ふているバージョンは次。

 Android Studio : 3.5.2
 Kotlin : 1.3.61

第二の Fragmentへのボタン追加 - fragment_second.xml

 前回既に 第二の Fragmentのレイアウトとプログラムコードは生成済み。それぞれ次。
  • fragment_second.xml (レイアウト)
  • SecondFragment.kt (プログラムコード)
 まづは、レイアウトにボタンを追加する。 作業手順は次

  1. fragment_second.xmlを 選択し、 Designモードで開く。
  2. Palette ウインドウから、Button部品を選択し、イメージビューに配置する。
  3. そのボタンのAttributes 画面で、id を button2 とする。
  4. 同じく、Attributes 画面で、textを to Main Fragment とする。
 以上で、レイアウトは終わり。なほ、第二の Fragment レイアウトに対して、上記以外の特段の設定はしてゐない。生成されたときのまま次のやうになつてゐる。
  • レイアウトはFrameLayout。
  • TextView部品があり、hello_blank_fragmentが左上に表示。
 また、ConstraintLayoutにも変へてゐないので、TextViewも追加したボタンも左上に勝手に配置されてゐる。見栄えは好きに変へればよし。



Activityへのイベント処理の追加 - MainActivity.kt

 MainFragmentのボタンが押されたら、第二のFragmentに切り替はる処理を書く。既に前回、 onButtonClicked( ) が呼び出されるまでは作成済みなので、この中に、SecondFragmentに切り替へる処理を書くだけ。


override fun onButtonClicked() {
        Log.i("mylog", "onButtonClicked")
        val secondFragment = SecondFragment()
        supportFragmentManager.beginTransaction().replace(R.id.container, secondFragment).commitNow()
}

コードの内容は次のたうり。

  • 2行目: Logcatに表示する単なるログ
  • 3行目:
    • クラス SecondFragmentの実体を生成。 MainFragment.ktでは、companion objectとして、fun newInstance( ) 関数が定義されていた。 
  • 4行目:
    • やっていることは、onCreateView( )の中でなされている MainFragmentの表示処理と同じ。レイアウト main_activity.xmlで定義されている containerという idに、3行目で生成した SecondFragmentの実体を設定してゐる。最後に、commintNow( )を呼び出して、即時に replace( )処理が実行される。
 ここまでで、ビルドして実行。 MainFragment が表示される。To Second Fragment のボタンを押すと、期待どほり、Second Fragmentに切り替はる。


MainFragment のゆくへ - MainFragment.kt

 replace( )された MainFragmentの実体はどこへ行つたのか。 破棄(destroy) されて、なくなつた。確認のためのログ表示のため、次のコードを、MainFragment.kt の中の class MainFragment に追加する。


    override fun onDestroy() {
        Log.i("mylog", "MainFragment: onDestroy")
        super.onDestroy()
    }

ビルドして実行。 Logcatのログを確認する。この onDestroy( )が呼ばれてゐることがわかる。

 Android Developperのwebサイトで fragmentの lifecycleを確認しておく。

以上でおしまい。

以降はここまでのコード。

ここまでのコード

MainActivity.kt


class MainActivity : AppCompatActivity(), MainFragment.OnButtonClickListener, SecondFragment {

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

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, MainFragment.newInstance())
                .commitNow()
        }
      }

    override fun onButtonClicked() {
        Log.i("mylog", "onButtonClicked")
        val secondFragment = SecondFragment()
        supportFragmentManager.beginTransaction().replace(R.id.container, secondFragment).commitNow()
    }
}

MainFragment.kt


class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val view = inflater.inflate(R.layout.main_fragment, container, false)
        val button = view.findViewById<Button>(R.id.buttonMain)
        button.setOnClickListener {
            val listener = context as? OnButtonClickListener
            listener?.onButtonClicked()
        }
        return view
    }

    interface OnButtonClickListener {
        fun onButtonClicked()
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        // TODO: Use the ViewModel
    }

    override fun onDestroy() {
        Log.i("mylog", "MainFragment: onDestroy")
        super.onDestroy()
    }
}


(了)



アーカイブ