Перейдите в MainActivity с помощью Jetpack Navigation - PullRequest
0 голосов
/ 25 октября 2019

Как я могу перейти от SettingsListFragment в моей MainActivity?

<fragment
        android:id="@+id/settings_list_fragment"
        android:name="com.mandarine.targetList.features.settings.SettingsListFragment"
        android:label="@string/settings"
        tools:layout="@layout/fragment_settings_list">
    </fragment>

Потому что в моем графике навигации у меня нет экрана из MainActivity. Вся навигация, которую я имею в своем одном действии, вы можете проверить код

class MainActivity : AppCompatActivity(), MainActivityViewContract {

    private lateinit var auth: FirebaseAuth
    private lateinit var mAuthStateListener: FirebaseAuth.AuthStateListener
    private val presenter = MainActivityPresenter(contract = this)
    private lateinit var appBarConfiguration: AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)
        signIn()
        setupViews()
    }

    override fun onSupportNavigateUp(): Boolean {
        return findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration)
    }

    override fun onResume() {
        super.onResume()
        auth.addAuthStateListener(mAuthStateListener)
    }

    override fun onPause() {
        super.onPause()
        auth.removeAuthStateListener(mAuthStateListener)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        presenter.onActivityResult(requestCode, resultCode)
    }

    override fun cancelSignIn() {
        finish()
    }

    private fun setupViews() {
        val host: NavHostFragment = supportFragmentManager
            .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return

        val navController = host.navController
        appBarConfiguration = AppBarConfiguration(navController.graph)

        val drawerLayout: DrawerLayout? = findViewById(R.id.drawer_layout)
        appBarConfiguration = AppBarConfiguration(
            setOf(R.id.target_list, R.id.settings_list_fragment, R.id.calendar_fragment),
            drawerLayout
        )
        setupActionBar(navController, appBarConfiguration)
        setupNavigationMenu(navController)
        setupBottomNavMenu(navController)
    }

    private fun setupNavigationMenu(navController: NavController) {
        val sideNavView = findViewById<NavigationView>(R.id.nav_view)
        sideNavView?.setupWithNavController(navController)
    }

    private fun setupActionBar(
        navController: NavController,
        appBarConfig: AppBarConfiguration
    ) {
        setupActionBarWithNavController(navController, appBarConfig)
    }

    private fun setupBottomNavMenu(navController: NavController) {
        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_navigation_view)
        bottomNavigationView?.setupWithNavController(navController)
    }

    private fun signIn() {
        auth = FirebaseAuth.getInstance()
        mAuthStateListener = FirebaseAuth.AuthStateListener { firebaseAuth ->
            presenter.signIn(activity = this, user = firebaseAuth.currentUser)
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Вопрос не совсем понятен, но похоже, что вы пытаетесь добиться фрагментарной навигации с помощью NavController. Прежде чем ответить на вопрос, позвольте мне дать вам краткое представление о том, как работает новая навигационная система Jetpack.

В вашем приложении будет одно действие (также может быть несколько действий, но для объясненияЯ придерживаюсь одного)В этом конкретном упражнении у вас есть один NavigationHostFragment, который отвечает за всю навигацию вашего приложения. Это NavigationHostFragment будет эквивалентно контейнеру для добавления фрагментов старым способом. NavigationHostFragment будет иметь навигационный контроллер, который будет связан с раскадровкой. Файл navigation.xml, который вы указали в вопросе, является вашей раскадровкой.

Раскадровка будет содержать все фрагменты, которые вам нужны в навигации и в направлениях навигации. Указания по навигации называются действиями. Каждое действие во фрагменте будет переходом к отдельному фрагменту.

Следовательно, навигация не имеет никакого отношения к Activity, все это происходит в NavigationHostFragment (что, я надеюсь, уже имеется в вашемXml-файл упражнения).

С этими основами, с двумя фрагментами, в которых FragmentA перемещается к FragmentB, ваш xml-файл навигации будет выглядеть примерно так:

<fragment android:id="@+id/fragmentA" android:name="com.xxx.xxx.FragmentA"
          android:label="fragment_a" tools:layout="@layout/fragment_a">
    <action android:id="@+id/action_fragmentA_to_fragmentB"
            app:destination="@id/fragmentB"/>
</fragment>
<fragment android:id="@+id/fragmentB"
          android:name="com.xxx.xxx.FragmentB"
          android:label="fragment_b" tools:layout="@layout/fragment_b">
</fragment>

А затем в FragmentA коде, где вам нужно выполнить навигацию, просто позвоните:

findNavController().navigate(R.id.action_fragmentA_to_fragmentB)
0 голосов
/ 04 ноября 2019

Вы можете добавить тег <activity../> на график навигации и установить его в качестве пункта назначения в действиях.

<activity
  android:id="@+id/main_activity_destination"
  android:name="com.mandarine.your.package.path.here.MainActivity" />

Затем вы можете позвонить navController.navigate(R.id.main_activity_destination)

Или, если выЧтобы получить больше контроля над потоком из графика навигации, вы можете создать действие:

<action
  android:id="@+id/go_to_main_activity"
  app:clearTask="true"
  app:destination="@+id/main_activity_destination"
  app:launchSingleTop="true"
  app:popUpTo="@id/main_activity_destination" />

Затем вы можете позвонить navController.navigate(R.id.go_to_main_activity)

...