Подтвердить что ты не робот

Замена значка меню ActionBar с неопределенным шагом ProgressBar

Я хотел бы добавить неопределенный индикатор выполнения в Honeycomb ActionBar, так что в любое время, когда пользователь нажимает "Обновить", значок обновления временно превращается в неопределенный индикатор выполнения, пока задача не завершится. Приложение электронной почты делает это уже, но я не могу понять, как это сделать.

Любые советы?

4b9b3361

Ответ 1

Сложно сказать, как это работает приложение электронной почты, но вы можете остаться простым и просто вызвать setIcon с идентификатором a StateDrawable XML файл, а затем просто измените состояние с помощью таймера.

Ответ 2

Чтобы прояснить ответ Jon O, ключ должен установить и отключить действие в действии обновления. Это работает как в ActionBarSherlock, так и в собственной панели действий 4.x. Следующий фрагмент будет помещать прогресс в неопределенный вид поверх значка обновления, предполагая, что пункт меню обновления имеет идентификатор "refresh_option", а макет замены (который имеет ProgressBar) находится в макете "progress_wheel":

 MenuItem item = abmenu.findItem(R.id.refresh_option);
 LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 View abprogress = inflater.inflate(R.layout.progress_wheel, null);
 item.setActionView(abprogress);

Отключите представление прогресса, и значок обновления вернется к видимости:

 item.setActionView(null);

Смотрите более подробный пример на github.

Ответ 3

Оказывается, Google опубликовал пример того, как делать это в рамках своего более широкого проекта совместимости ActionBarCompat. Посмотрите.

Ответ 4

Чтобы упростить ответ larham1: вам даже не нужно раздувать новый вид действия, потому что MenuItem имеет метод, который принимает идентификатор макета действия, поэтому вы можете просто написать:

item.setActionView(R.layout.progress_bar);

Ответ 5

Я использую код, предоставленный в оригинальной версии здесь: https://github.com/JakeWharton/ActionBarSherlock/issues/425

За исключением android:layout_width и android:layout_height (в actionbar_indeterminate_progress.xml) я использую 32dp; так как это было сделано в ActionBarCompat: http://developer.android.com/resources/samples/ActionBarCompat/res/layout-v11/actionbar_indeterminate_progress.html

Ответ 6

Вы можете легко сделать это:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_refresh: 
                item.setActionView(new ProgressBar(this));
                break;
        }
        return super.onOptionsItemSelected(item);