Замена иконки бургера на стрелочку

102
31 марта 2022, 23:50

Получилось синхронизировать состояние бокового меню с кнопкой бургера через ActionBarDrawerToggle. Т.е. иконка бургера превращается в стрелочку при появлении меню. Теперь мне нужно сделать так, что-бы при нажатии на кнопку поиска в toolbar изменялось состояние ActionBarDrawerToggle с бургера на стрелочку и обратно.

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
            R.id.nav_tools, R.id.nav_share, R.id.nav_send)
            .setDrawerLayout(drawer)
            .build();
    toggle = new ActionBarDrawerToggle(
            this,
            drawer,
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close);
    toggle.setDrawerIndicatorEnabled(true);
    //noinspection deprecation
    drawer.setDrawerListener(toggle);
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);}
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.

    getMenuInflater().inflate(R.menu.main, menu);


    SearchManager searchManager =
            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.app_bar_search).getActionView();
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));
    searchView.setMaxWidth(Integer.MAX_VALUE);

    return true;
}
@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, mAppBarConfiguration)
            || super.onSupportNavigateUp();
}
Answer 1

По хорошему этот бургер был создан специально в пару DrawerLayout-у, и привязывать еще что-то к нему не доброе дело. Надо бы свой написать, чтобы избегать всяких странных конфликтов.

А вообще можете ставить ему любое состояние методом toggle.onDrawerSlide(View, Float). Что там за View передается уже не помню, Float значение принимается от 0 до 1, где 0 это бургер, 1 это стрелка, 0.5 это на полпути с одного в другое.

Можете создать VelueAnimator из запускать изменение с 0 до 1, если покопаетесь в исходниках, найдете используемый интерполятор и продолжительность для "выезжания" NavView, чтобы их же использовать на анимации при активации поиска, иначе у вас при клике по бургеру будет одна скорость анимации, а при клике по поиску другая.

Еще надо решить что делать если юзер вытащил NavView жестом, когда выделен поиск и toggle уже в виде стрелочки. Если проигнорировать - будет скачок со стрелки на бургер и начнется анимация обратно к стрелке пропорционально выдвижению NavView

READ ALSO
Обнуление массива за константное время

Обнуление массива за константное время

На интервью задали такую задачу: дан массив длиной n, необходимо реализовать методы добавления элемента и обнуление(значения всех элементов...

83
Плавный переход между фрагментами. Android Studio

Плавный переход между фрагментами. Android Studio

Создал проект с шаблоном Bottom Navigation ActivityФрагменты, которые входят в нижнее меню, плавно сменяют друг друга

101
не выводит изображение в список

не выводит изображение в список

Смысл программы, выводить список с животными и их фотографиямиОднако он выводит только название

92
Как собрать стэк-трейсы конкретных тредов с sample interval ± 100ms

Как собрать стэк-трейсы конкретных тредов с sample interval ± 100ms

Есть OpenJDK8Есть пул потоков ExecutorService к примеру размером 40

96