Как показать индикатор неопределенного хода при нажатии кнопки "Обновить" в ActionBarSherlock?
Как показать Indeterminate ProgressBar
, когда кнопка Refresh
нажата в ActionBarSherlock
и снова показать кнопку обновления, когда ViewGroup обновлена?
Обновление 1:
У меня есть ответ, который является неполным. Я помещаю щедрость на вопрос, чтобы другие разработчики могли помочь создать хороший ответ, который может быть полезен другим в будущем.
Как мы можем показать Indeterminate ProgressBar
, который выглядит так, как показано на рисунке ниже ![enter image description here]()
Ответы
Ответ 1
Кажется, что ActionBarSherlock не предоставляет специальный метод для анимации обновленного MenuItem.
Что вы можете сделать (с помощью классического API Android) - использовать метод setActionView(int resId)
и указать идентификатор макета с помощью ProgressBar.
В начале действия обновления просто вызовите:
item.setActionView(R.layout.refresh_menuitem);
И когда ваше действие обновления завершено, выполните:
item.setActionView(null);
Вот пример того, что может иметь файл макета refresh_menuitem.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:addStatesFromChildren="true"
android:focusable="true"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:gravity="center"
style="?attr/actionButtonStyle">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
style="@android:style/Widget.ProgressBar.Small"/>
</LinearLayout>
Ответ 2
Вот как вы добавляете такой неопределенный ProgressBar с объектом ActionBarSherlock
: (на самом деле это проще другого, но progressBar показан один, а не выше MenuItem
)
1. Поместите эту строку в метод onCreate() перед вызовом setContentView():
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- > В этой строке указывается, что вы будете использовать неопределенную функцию ProgressBar.
2 - Включите неопределенный ProgressBar, вызвав:
setSupportProgressBarIndeterminateVisibility(true);
3 - Отключите неопределенный ProgressBar, вызвав:
setSupportProgressBarIndeterminateVisibility(false);
Примечание. Посмотрите в папку образца папки ActionBarSherlock. Я нашел этот код в следующем файле:
JakeWharton-ActionBarSherlock-9598f2b\Образцы\Demos\SRC\ком\ActionBarSherlock\\ образец демки\IndeterminateProgress.java
Ответ 3
Вот полный код:
private static final int menuItemIdRefresh = 10; //class constant
private boolean refresh;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem refreshItem = menu.add(0, menuItemIdRefresh, 0,
getString(R.string.action_refresh)).setShowAsActionFlags(
MenuItem.SHOW_AS_ACTION_ALWAYS);
if (isRefreshing) {
refreshItem.setActionView(R.layout.indeterminate_progress);
} else {
refreshItem.setActionView(null);
refreshItem.setIcon(R.drawable.ic_refresh);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case menuItemIdRefresh: {
//the user has pressed the refresh button
if (!isRefreshing) {
isRefreshing = true;
new RefreshMyViewAsyncTask().execute("");
}
}
break;
default:
break;
}
return false;
}
Последнее замечание, чтобы получить вышеприведенный код, вам понадобится также поддержка поддержкиInvalidateOptionsMenu(). Вы можете добавить это к методу RefreshMyViewAsyncTask onPreExecute().
Надеюсь, это поможет кому-то.