Обновление меню ActionBar в зависимости от места назначения навигации - PullRequest
0 голосов
/ 21 апреля 2019

Я хотел бы изменить пункты меню, отображаемые в моем ActionBar, в зависимости от текущего назначения моего NavController. Под «изменением» я подразумеваю раздувание указанного меню-XML для каждого пункта назначения.

Поведение можно сравнить с интегрированным способом, которым новая навигационная система изменяет заголовок ActionBar, в зависимости от заданного android:label для целевого фрагмента в xml навигации.

Пока что я настроил базовое действие с ActionBar и DrawerLayout, используя новую навигацию Android. Также я создал все необходимые XML-файлы и фрагменты для навигации.

...

@Override
protected void onCreate(Bundle savedInstanceState)
{
    ...    

    this._drawerLayout = this.findViewById(R.id.drawer_layout);

    Toolbar toolbar = this.findViewById(R.id.action_bar);
    this.setSupportActionBar(toolbar);

    ActionBar actionbar = Objects.requireNonNull( this.getSupportActionBar() );
    actionbar.setDisplayHomeAsUpEnabled(true);
    actionbar.setHomeAsUpIndicator(R.drawable.ic_menu);

    NavigationView navigationView = this.findViewById(R.id.navigation_view);
    navigationView.setNavigationItemSelectedListener(menuItem -> {
        menuItem.setChecked(true);
        this._drawerLayout.closeDrawers();

        return true;
    });

    NavController navController = Navigation.findNavController(this, R.id.navigation_host);
    NavigationUI.setupWithNavController(toolbar, navController, this._drawerLayout);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Here I inflate the ActionBar menu that is kept between all destinations.
    // Instead of keeping the same menu between all destinations I want to display different menus depending on the destination fragment.
    this.getMenuInflater().inflate(R.menu.actionbar_items, menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch(item.getItemId())
    {
        case android.R.id.home:
            this._drawerLayout.openDrawer(GravityCompat.START);
            return true;
        case R.id.appbar_search:
            return true;
    }

    return super.onOptionsItemSelected(item);
}

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

Есть ли способ добиться этого с помощью новой навигационной системы или любым другим способом?

1 Ответ

0 голосов
/ 22 апреля 2019

Я нашел способ добиться желаемого поведения, вызвав menu.clear(); перед тем, как накачать обновленный макет.Мне все еще интересно, есть ли встроенный способ добиться этого с помощью новой навигационной системы.

Во фрагменте назначения, который я использую сейчас:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
    super.onCreateOptionsMenu(menu, inflater);

    menu.clear();
    inflater.inflate(R.menu.toolbar_items_idle, menu);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...