Help us understand the problem. What is going on with this article?

Navigationで最初のFragmentにActivityから引数を渡す

More than 1 year has passed since last update.

「Navigationで最初のFragmentにActivityから引数を渡す」とは?

Navigationを使ってAndroidアプリを開発している時に、
「別のActivityから渡された引数をNavigationで設定した最初のFragmentに渡したい!」
なんて事がある場合の実装方法になります。

:computer:環境構築


    // Navigation
    def navi_version = "2.2.0-alpha01"
    implementation "androidx.navigation:navigation-fragment-ktx:$navi_version"
    implementation "androidx.navigation:navigation-ui-ktx:$navi_version"

Navigation 1.0.0-alpha07以上のバージョンで動作可能

:pencil: 実装


ActivityとFragmentの構成

MainActivityにNavHostFragmentを指定しており、FirstFragmentがNavGraphに指定してある。

  • res/navigation/nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/nav_graph"
            app:startDestination="@id/firstFragment"
            tools:ignore="UnusedNavigation">

    <fragment android:id="@+id/firstFragment" 
                             android:name="com.xxxx.xxxxx.FirstFragment"
                             android:label="fragment_first"
                             tools:layout="@layout/fragment_first"/>
</navigation>
  • MainActivity

レイアウトファイル

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.xxxx.xxxx.MainActivity">

    <fragment
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:defaultNavHost="true"/>

</androidx.constraintlayout.widget.ConstraintLayout>

navGraphの指定をする app:navGraph="@navigation/nav_graph" は設定しない

class MainActivity : AppCompatActivity() {

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

        findNavController(R.id.nav_host_fragment)
            .setGraph(R.navigation.nav_graph, intent.extras)
    }

    companion object {
        private val TAG = MainActivity::class.java.simpleName
    }
}

コード上でNavGraphを設定し、その時に引数を渡してあげる。
↑の場合、MainActivityに渡された引数をそのままFirstFragmentに渡している。

以上

:link: 参考になったURL


Slowhand0309
Android, iOS, Rails, C/C++, Typescript
sikmi
しくみ製作所株式会社は、世の中の「しくみ」を素敵にするためのソフトウェア開発集団です。オフィスのない弊社は、メンバー全員リモートワークです!
https://sikmi.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away