eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

Android Navigation Componentsのファーストインプレッション

本当に動くの?

  • 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 xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <fragment
            android:id="@+id/NavigationHost"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@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
            android:id="@+id/first_to_second"
            app:destination="@id/secondFragment"
            app:popUpTo="@id/main" />

ハマりそうな

  • Nested-Fragment前提で作ってないClass郡をNavigation Componentsに移行するとハマりそう