Компонент архитектуры навигации - как установить / изменить пользовательскую иконку спины или гамбургера с помощью контроллера навигации? - PullRequest
0 голосов
/ 30 октября 2018

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

Я уже настроил базовую навигацию, в том числе расположение ящиков, с помощью панели инструментов в MainActivity так:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navController = Navigation.findNavController(this, R.id.mainNavFragment)

        // Set up ActionBar
        setSupportActionBar(toolbar)
        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)

        // Set up navigation menu
        navigationView.setupWithNavController(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.mainNavFragment), drawerLayout)
    }
}

С этим макетом:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:navigationIcon="@drawable/ic_home_black_24dp"/>

    </android.support.design.widget.AppBarLayout>

    <fragment
        android:id="@+id/mainNavFragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_main"/>

</LinearLayout>

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

как я могу установить собственный значок для гамбургера или значок назад?

, которая на данный момент обрабатывается самим NavigatoinController.

enter image description here

Я уже пробовал варианты ниже, но это не работает:

app:navigationIcon="@drawable/ic_home_black_24dp" //1
supportActionBar.setHomeAsUpIndicator(R.drawable.ic_android_black_24dp) //2

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 января 2019

У меня была такая же проблема с навигационной версией 1.0.0-alpha08. Я решил эту проблему путем повторной реализации setupActionBarWithNavController, чтобы предоставить мне необходимое поведение.

setDisplayShowTitleEnabled(false) //Disable the default title

container.findNavController().addOnDestinationChangedListener { _, destination: NavDestination, _ ->
    //Set the toolbar text (I've placed a TextView within the AppBar, which is being referenced here)
    toolbar_text.text = destination.label

    //Set home icon
    supportActionBar?.apply {
        setDisplayHomeAsUpEnabled((destination.id in NO_HOME_ICON_FRAGMENTS).not())
        setHomeAsUpIndicator(if (destination.id in TOP_LEVEL_FRAGMENTS) R.drawable.app_close_ic else 0)
    }
}

Все, что вам нужно сделать, это добавить onDestinationChangedListener к вашему контроллеру навигации и установить заголовок и значок для каждого пункта назначения.

Этот код должен быть помещен в метод onCreate () в деятельности, содержащей ваш граф навигации, и NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout) должен быть удален из вашего кода.

Обратите внимание, что это удалит функциональность по умолчанию для панели навигации.

Надеюсь, это поможет!

0 голосов
/ 10 ноября 2018

У меня та же проблема с использованием навигационной версии 1.0.0-alpha07. Я нашел следующий обходной путь:

В своей работе я установил представление панели инструментов и в качестве панели действий поддержки, и с помощью контроллера nav:

val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
toolbar.setupWithNavController(navController, appBarConfiguration)

Затем в onViewCreated моего фрагмента, где я хочу заменить значок стрелки, я устанавливаю значок и включаю его (возможно, это можно сделать в onAttached):

(requireActivity() as AppCompatActivity).supportActionBar?.apply {
  setHomeAsUpIndicator(R.drawable.ic_close_24dp)
  setDisplayHomeAsUpEnabled(true)
}

Компонент навигации по-прежнему правильно обрабатывает backstack, анимацию и удаляет значок на начальном фрагменте, когда я делаю это. Надеемся, что перед выходом из alpha компонент навигации поддерживает настраиваемые значки без необходимости прибегать к старому стилю API панели действий.

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