2011-08-22 4 views
17

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

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

+0

Связанные для обновления/освежающий: http://stackoverflow.com/questions/9731602/animated-icon-for-actionitem – rds

ответ

5

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

+1

Набор иконок можно только на вкладке Icon, а не для самого ActionBar. Является ли это случайным образом также для ActionIcons или этот ответ неправильный? – Janusz

4

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

+0

Этот пример основан на заданном макете с соседним значком обновления и неопределенным прогрессом, используя show/hide. В ActionBar у нас нет такого макета и доступа. Попытка идеи Femi следующая ... – larham1

+0

Он действительно использует шоу/скрыть на старых устройствах, да; однако, если вы посмотрите в классах ActionBarHelperHoneycomb/ActionBarHelperICS, они делают это надлежащим образом/обновленным способом для ICS и Honeycomb. Он работает на всех устройствах (я знаю, я использую его в своем приложении для 2.1+, 3.x и 4.x, и он работает на всех из них, включен неопределенный индикатор выполнения.) –

+0

Ссылка в настоящее время отключена (Google решил удалить URL-адрес? Вздох) – Adam

3

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

17

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

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

item.setActionView(null); 

См a more detailed example на GitHub.

+0

Проблема в следующем: новый ProgressBar немного шире, чем обычный элемент действия. Таким образом, все соседние предметы немного смещаются в стороны (и «откидываются назад», когда они исчезают). Любая идея о том, как это решить? –

2

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

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

Проблема заключается в следующем: новый ProgressBar немного шире, чем обычный элемент действия. Таким образом, все соседние предметы немного смещаются в стороны (и «откидываются назад», когда они исчезают). Любые идеи о том, как это решить? –

+0

Я создал файл макета с помощью '' ' '' '. Это позволяет избежать смещения элементов меню. Не забудьте установить '' 'item.setActionView (R.layout.your_layout);' '' –

4

Для упрощения larham1's answer: вам даже не нужно раздувать новый вид действий само по себе, потому что MenuItem имеет the method, который принимает идентификатор компоновки действий, так что вы можете просто написать :

item.setActionView(R.layout.progress_bar);