Как настроить Nav Controller в AndroidX?

Я использую следующий макет активности с fragment и BottomNavigationView:

<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical">

    <fragment
        android:layout_width = "match_parent"
        android:layout_height = "0dp"
        android:id = "@+id/fragment"
        android:layout_weight = "1"
        android:name = "androidx.navigation.fragment.NavHostFragment"
        app:newGraph = "@navigation/navigation_bottom"
        app:defaultNavHost = "true"/>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:id = "@+id/bottom_navigation_view"
        app:menu = "@menu/bottom_navigation_menu"/>
</LinearLayout>

В своей деятельности я пытаюсь настроить Nav Controller, но получаю следующую ошибку:

Cannot resolve method 'setupWithNavController(androidx.navigation.NavController)'

Это то, что я пробовал:

navController = Navigation.findNavController(this, R.id.fragment);
BottomNavigationView bnv = findViewById(R.id.bottom_navigation_view);
bnv.setupWithNavController(navController); //Error
NavigationUI.setupActionBarWithNavController(this, navController);

Мои зависимости:

implementation 'android.arch.navigation:navigation-fragment:1.0.0-rc02'
implementation 'android.arch.navigation:navigation-ui:1.0.0-rc02'

Как я могу подключить это? Спасибо!

4
0
4 063
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Убедитесь, что эти два свойства включены в вашем gradle.properties.

android.useAndroidX=true

android.enableJetifier=true

Обновлять

И убедитесь, что вы тоже используете эти библиотеки.

implementation 'androidx.core:core: 1.0.1'
implementation 'androidx.appcompat:appcompat:1.0.2

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

Johans Bormman 01.03.2019 18:34

В файле gardle.properties.

Hussnain Haidar 01.03.2019 18:35

Просто добавил обе строки кода в gradle.properties ниже org.gradle.jvmargs=-Xmx1536m и все испортилось :( Я добавил в правильном месте?

Johans Bormman 01.03.2019 18:38

Не могли бы вы указать точное место, где добавить android.useAndroidX=true и android.enableJetifier=true? Просто добавил обе зависимости и имеет такое же поведение.

Johans Bormman 01.03.2019 18:44
Ответ принят как подходящий

Синтаксис bnv.setupWithNavController использует метод расширения Kotlin — вы должны использовать Kotlin и зависимости -ktx, чтобы иметь доступ к расширениям Kotlin в соответствии с примечанием в Документация по объявлению зависимостей:

implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-rc02'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-rc02'

Если вы пишете код Java, вам нужно напрямую использовать методы NavigationUI:

NavigationUI.setupWithNavController(bnv, navController);

Он использует Java.

Hussnain Haidar 01.03.2019 18:36

Я пишу на Java, а не на Котлине. Просто добавил в качестве теста оба, и у меня такая же ошибка.

Johans Bormman 01.03.2019 18:36

Добавлено примечание о том, что вы должны использовать синтаксис NavigationUI для использования Java.

ianhanniballake 01.03.2019 18:39

Получение следующей ошибки: Cannot resolve method 'setupWithNavController(com.google.android.material.bottomna‌​vigation.BottomNavig‌​ationView, androidx.navigation.NavController)'

Johans Bormman 01.03.2019 18:41

Похоже, вы либо вообще не используете AndroidX, либо неправильно перешли на AndroidX в соответствии с инструкции, либо вам может просто понадобиться выполнить очистку и перестроить после перехода на AndroidX.

ianhanniballake 01.03.2019 18:51

Да, проблема была в том, что я неправильно перешел на AndroidX и NavigationUI.setupWithNavController(bnv, navController); сделал свое дело. Большое тебе спасибо!

Johans Bormman 01.03.2019 19:34

Я также пробовал свой код в Kotlin, и эти две зависимости являются обязательными, как объясняется в вашем ответе. Тоже проголосовал. Еще раз спасибо @ianhanniballake

Johans Bormman 02.03.2019 09:22

Этот тип строк (с реализацией) можно добавить в раздел

dependencies {
   implementation 'androidx.core:core: 1.0.1'
   implementation 'androidx.appcompat:appcompat:1.0.2

}

в приложении/build.gradle. И этот тип строк с (android.useAndroidX=true и android.enableJetifier=true) можно добавить в gradle.properties

android.useAndroidX=true 
android.enableJetifier=true

Но, пожалуйста, проверьте, прежде чем это еще не существует :)

Другие вопросы по теме