0

如何从 MainActivity 中的 SettingsListFragment 移动?

<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)
        }
    }
}
4

2 回答 2

0

您可以<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)

于 2019-11-04T11:20:44.580 回答
0

这个问题并不完全清楚,但看起来你想要实现的是使用 NavController 的片段导航。在回答这个问题之前,让我先简单了解一下新的喷气背包导航是如何工作的。

您的应用程序中将只有一个活动(也可以有多个活动,但为了解释起见,我坚持使用一个)。在这个特定的活动中,您有一个单独的NavigationHostFragment,它负责您的所有应用程序导航。这NavigationHostFragment将相当于以旧方式添加片段的容器。将NavigationHostFragment有一个导航控制器,它将链接到情节提要。您在问题中提到的navigation.xml文件是您的故事板。

故事板将包含您在导航和导航方向中需要的所有片段。导航方向称为操作。片段中的每个动作都将导航到单独的片段。

因此导航与 Activity 无关,这一切都发生在 Activity 中NavigationHostFragment(我希望您已经在 Activity 的 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)
于 2019-11-04T11:57:13.500 回答