概要
2つの Fragment で画面を切り替へるアプリケーションを作る前回のつづき。今回は、第二の Fragment を作り、画面を切り替へるまで。
使ふているバージョンは次。
Android Studio : 3.5.2
Kotlin : 1.3.61
使ふているバージョンは次。
Android Studio : 3.5.2
Kotlin : 1.3.61
第二の Fragmentへのボタン追加 - fragment_second.xml
前回既に 第二の Fragmentのレイアウトとプログラムコードは生成済み。それぞれ次。
- fragment_second.xml (レイアウト)
- SecondFragment.kt (プログラムコード)
まづは、レイアウトにボタンを追加する。 作業手順は次
- fragment_second.xmlを 選択し、 Designモードで開く。
- Palette ウインドウから、Button部品を選択し、イメージビューに配置する。
- そのボタンのAttributes 画面で、id を button2 とする。
- 同じく、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()
}
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()
}
}
(了)
0 件のコメント:
コメントを投稿