Ответ 1
Сложно сказать, как это работает приложение электронной почты, но вы можете остаться простым и просто вызвать setIcon с идентификатором a StateDrawable
XML файл, а затем просто измените состояние с помощью таймера.
Я хотел бы добавить неопределенный индикатор выполнения в Honeycomb ActionBar, так что в любое время, когда пользователь нажимает "Обновить", значок обновления временно превращается в неопределенный индикатор выполнения, пока задача не завершится. Приложение электронной почты делает это уже, но я не могу понять, как это сделать.
Любые советы?
Сложно сказать, как это работает приложение электронной почты, но вы можете остаться простым и просто вызвать setIcon с идентификатором a StateDrawable
XML файл, а затем просто измените состояние с помощью таймера.
Чтобы прояснить ответ 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.
Оказывается, Google опубликовал пример того, как делать это в рамках своего более широкого проекта совместимости ActionBarCompat. Посмотрите.
Чтобы упростить ответ larham1: вам даже не нужно раздувать новый вид действия, потому что MenuItem
имеет метод, который принимает идентификатор макета действия, поэтому вы можете просто написать:
item.setActionView(R.layout.progress_bar);
Я использую код, предоставленный в оригинальной версии здесь: 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
Вы можете легко сделать это:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_refresh:
item.setActionView(new ProgressBar(this));
break;
}
return super.onOptionsItemSelected(item);