Замена значка элемента меню ActionBar неопределенным ProgressBar - PullRequest
18 голосов
/ 22 августа 2011

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

Любой совет?

Ответы [ 6 ]

19 голосов
/ 11 ноября 2012

Чтобы прояснить ответ Джона О, необходимо установить и отменить представление действия для действия обновления. Это работает как в 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.

5 голосов
/ 31 июля 2014

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

item.setActionView(R.layout.progress_bar);
5 голосов
/ 22 августа 2011

Трудно точно сказать, как это делает приложение электронной почты, но вы можете остаться простым и просто позвонить setIcon с идентификатором StateDrawable XML-файла, а затем просто изменить состояние, используя Таймер.

4 голосов
/ 01 января 2012

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

3 голосов
/ 08 июня 2012

Я использую код, предоставленный в оригинальном выпуске здесь: 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

2 голосов
/ 18 июля 2014

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

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