Android Jetpack 导航控制器 |获取当前目的地的操作列表

Android Jetpack NavController | Get list of actions for current destination

我正在创建一个使用 Android 的新 Jetpack Navigation NavController 的投资组合应用程序。我创建了一个带有 RecyclerView 的片段,其中将填充视图,您可以单击这些视图以导航到各种应用程序演示(如果我能弄清楚的话,也许还有我制作的实际应用程序)。我目前正在手动填充列表,但我想自动执行该过程。

class PortfolioFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_portfolio, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val navController = view.findNavController()
        val currentDestination = navController.currentDestination

        // How get list of actions?
        val appActions = listOf(
            R.id.action_portfolioFragment_to_testFragment
        )

        portfolio_app_list.layoutManager = LinearLayoutManager(context)
        portfolio_app_list.adapter = PortfolioAdapter(appActions)
    }
}

我在 NavGraph 上找不到任何方法,也找不到 NavDestination 来获取 currentDestination 可用的操作列表。我知道我的 navigation_main.xml 有它们,我可以使用 XMLPullParser 或类似的东西来获取它们,但我可能会开始使用 Safe Args plugin,这意味着获取实际的 class 来自 XML 会很痛苦。

这可能被认为有点 hacky。

NavDestination 有一个名为 mActions 的私有 属性,其中包含与 NavDestination.

关联的 NavActions

我通过使用反射来访问它解决了这个问题。

    val currentDestination = findNavController().currentDestination

    val field = NavDestination::class.java.getDeclaredField("mActions")
    field.isAccessible = true
    val fieldValue = field.get(currentDestination) as SparseArrayCompat<*>

    val appActions = arrayListOf<Any>()

    fieldValue.forEach { key, any ->
        appActions.add(any)
    }

NavActions 作为 SparseArrayCompat 返回,然后迭代以获得 List