Почему шаблон проекта Navigation Drawer (Studio 3.6.1) не загружает правильный контроллер на Android Nougat? - PullRequest
0 голосов
/ 29 февраля 2020

Фон проблемы

Я просто выбрал шаблон ящика навигации из шаблонов проекта (см. Выделенный элемент на изображении), собрал приложение и запустил его на эмуляторе (Android Nougat (v7) API 24).

navigation drawer project template

Проблема

Когда я открываю меню и выбираю другой элемент не загружает новый элемент (новый фрагмент через контроллер).

Подробнее о проблеме

  1. Приложение запускается здесь ... ( Домашний фрагмент - первое изображение).
  2. Я щелкаю пункт меню галереи (2-е изображение), и домашний фрагмент все еще отображается (см. первое изображение).

home fragment click gallery menu item

Что я пробовал

Я запустил этот же проект на другом эмуляторе, работающем Android P ie и все работает как положено - Когда я щелкаю по пункту меню галереи, фрагмент галереи загружается, и я вижу «Это фрагмент галереи».

Другие вещи, которые я пробовал * 1 043 *

Я также открыл logcat, а затем щелкнул пункт меню, но ничего не отображается, даже когда у меня отключены все фильтры.

Соответствующий код шаблона

Код шаблона в MainActivity (который загружает фрагменты и контроллеры, все инициализирует) в onCreate выглядит следующим образом:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)

        val fab: FloatingActionButton = findViewById(R.id.fab)
        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }

 // ###########################################################
 // #### MY NOTES -- This is the relevant code ################

        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(setOf(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow), drawerLayout)
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

Что / где я могу войти, чтобы определить, что происходит?

Можете ли вы сказать мне, почему это происходит?
Или, можете ли вы дать мне идею, где я могу поместить некоторые операторы регистрации, чтобы определить, что запускает, чтобы я мог сказать, что происходит сбой?

Обновление - дополнительная информация

Определенно что-то не так с шаблоном, потому что mobile_navigation. xml ссылается на класс, который даже не существует в проекте:

mobile_navigation.xml

Несмотря на то, что app.actionmobile.navdraw.ui.home.HomeSecondFragment не существует в этом проекте, приложение все еще собирается и запускается. Хм .... Не уверен, как это возможно.

К вашему сведению - это было добавлено шаблоном проекта, а не я.

Другое, что я пробовал Я установил измененную верхнюю часть mobile_navigation . xml from:

app:startDestination="@+id/nav_home"

до

 app:startDestination="@+id/nav_gallery"

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

Повторяющаяся проблема

Опять проблема, с которой я столкнулся, заключается в том, что выбор пункта меню не загружает новый фрагмент на нуге, а на P ie. Не уверен, как платформа исправляет это ???

1 Ответ

0 голосов
/ 03 марта 2020

Я наконец-то смог это исправить.

Старые зависимости в шаблонном проекте

Прежде всего мне пришлось обновить кучу пакетов, которые устарели (которые были добавлены шаблоном проекта по умолчанию).

Вот различия в зависимостях. Конечно, красные - это старые, а зеленые - новые:

diffs of dependencies

Нечетное

Однако странным является то, что при обновлении этих зависимостей вы получите предупреждение о том, что класс modelView устарел. В Студии это выглядит так (в каждом из фрагментов - все они определены шаблоном проекта:

viewModelProvider deprecated

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

import androidx.lifecycle.ViewModelProvider

Обратите внимание, что он является единичным (по сравнению со старым, который был ViewModelProviders) ... немного хитрым.

Вы также должны изменить каждый один из фрагментов, где они ссылаются на это, чтобы построить viewModel, чтобы код выглядел следующим образом:

galleryViewModel =
                ViewModelProvider.AndroidViewModelFactory.getInstance(Application())
                    .create(GalleryViewModel::class.java)

После внесения этих изменений и перестройки приложение не будет иметь никаких устаревших вызовов, и пункты меню будут работать на моем Изображение нуги также.

Успех!

Все еще довольно странно, что он ведет себя по-разному в разных версиях ОС. Но этого, вероятно, следует ожидать для неопределенного поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...