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

Как показать индикатор неопределенного хода при нажатии кнопки "Обновить" в ActionBarSherlock?

Как показать Indeterminate ProgressBar, когда кнопка Refresh нажата в ActionBarSherlock и снова показать кнопку обновления, когда ViewGroup обновлена?

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

Как мы можем показать Indeterminate ProgressBar, который выглядит так, как показано на рисунке ниже enter image description here

4b9b3361

Ответ 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().

Надеюсь, это поможет кому-то.