Android Jetpack NavController | Получить список действий для текущего пункта назначения - PullRequest
1 голос
/ 25 апреля 2020

Я создаю портфельное приложение, которое использует 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 , который мы будем иметь в виду, что получая реальный класс от XML будет боль.

1 Ответ

2 голосов
/ 25 апреля 2020

Это может считаться немного хакерским.

NavDestination имеет частное свойство с именем mActions, которое содержит NavActions, связанное с NavDestination.

Я решил это используя отражение, чтобы получить доступ к нему.

    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

...