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
我正在创建一个使用 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