本当に動くの?
- AS3.2.x系のNavigation Componentsは不安定で、だいたいNavigation Editorが正常動作しなかった
- AS3.3.x系でNavigation Components自体がExperimental機能として隠し扱いになった
- 今後もしばらくは不安定だと思う
Activityの移行
NavHostFragment
をレイアウトに仕込むだけ
lass MainActivity : AppCompatActivity() {
private val navHostFragment
get() = supportFragmentManager.findFragmentById(R.id.NavigationHost) as NavHostFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MainActivityBinding.inflate(layoutInflater).also {
it.setLifecycleOwner(this)
setContentView(it.root)
}
}
override fun onSupportNavigateUp(): Boolean = navHostFragment.navController.navigateUp()
}
xml version="1.0" encoding="utf-8"
<layout xmlnsandroid="http://schemas.android.com/apk/res/android"
xmlnsapp="http://schemas.android.com/apk/res-auto">
<LinearLayout
androidlayout_width="match_parent"
androidlayout_height="match_parent"
androidorientation="vertical">
<fragment
androidid="@+id/NavigationHost"
androidname="androidx.navigation.fragment.NavHostFragment"
androidlayout_width="match_parent"
androidlayout_height="match_parent"
appdefaultNavHost="true"
appnavGraph="@navigation/main" />
</LinearLayout>
</layout>
Fragment側の移行
- 特にすることはない
- と思いきや、Layoutを見てわかるとおり、Navigation ComponentsはNested-Fragmentとして動作する
Fragment.startActivityForResult()
の戻り値が取得できない
- Runtime PermissionのrequestPermission()は動作する
FragmentXを使用する
FragmentActivity.startActivityFromFragment()
というヘルパーが追加されている
- これを呼び出すことで、onActivityResult()がハンドリングできる
activity!!.startActivityFromFragment(this, intent, REQUEST_SHOW_SETTINGS)
スプラッシュ画面のように、前画面に戻らせたくない場合
- 基本的にはBackStackに詰まれるので、戻ることになる
- Actionの
app:popUpTo
オプションを指定する
<action
androidid="@+id/first_to_second"
appdestination="@id/secondFragment"
apppopUpTo="@id/main" />
ハマりそうな
- Nested-Fragment前提で作ってないClass郡をNavigation Componentsに移行するとハマりそう