Индикатор прогресса в заголовке приложения

Screenshot_При выполнении длительных операций, приложение должно развлекать пользователя анимированным индикатором прогресса. Если этого не делать, то он решит, что приложение зависло и скорее всего удалит его, т.к. по его мнению оно не доработанное.

Для реализации этой задачи можно в разных элементах интерфейса показывать виджет ProgressBar.

Показывать его можно, как в отдельном модальном окне, так и в различных средних и маленьких виджетах.

В данной статье я расскажу, как разместить эту анимацию в заголовке приложения, т.е. в элементе ActionBar и привязать её управление к текущему фрагменту.

 

Первым делом нужно создать свое меню для текущего фрагмента. Как это делается уже описано в данной статье.
Помещаем файл my_description_menu.xml в папку menu.
Со следующим содержимым:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/download_pb"
        android:title="Загрузка"
        app:showAsAction="always" />
</menu>

В меню у нас будет всего один элемент, без картинки, с заголовком «Загрузка» и с id = download_pb.

Создадим файл разметки actionbar_progress.xml  для нашего элемента в меню:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="56dp"
    android:minWidth="56dp">
    <ProgressBar
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_gravity="center" />
</FrameLayout>

 

Чтобы у фрагмента было собственное меню, его нужно указать при инициализации (как указано в названной статье) или при создании выставить свойство setHasOptionsMenu в true.

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);        
    }

Объявим класс меню в фрагменте:
private static Menu optionsMenu;
Его мы получим при создании меню:

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();
        optionsMenu = menu;
        inflater.inflate(R.menu.my_description_menu, menu);
        MenuItem refreshItem = optionsMenu.findItem(R.id.download_pb);
        refreshItem.setActionView(R.layout.actionbar_progress);
        super.onCreateOptionsMenu(menu, inflater);
    }

При создании меню мы сразу установили разметку для единственного элемента.
Таким образом крутящийся индикатор уже появился в меню.
Чтобы завершить или начать новый прогресс напишем функцию:

    public void setProgressButtonState(final boolean refreshing) {
        if (optionsMenu != null) {
            final MenuItem refreshItem = optionsMenu.findItem(R.id.download_pb);
            if (refreshItem != null) {
                if (refreshing) {
                    refreshItem.setVisible(true);
                    refreshItem.setActionView(R.layout.actionbar_progress);
                } else {
                    // refreshItem.setActionView(null);
                    refreshItem.setVisible(false);
                }
            }
        }
    }

Если мы в файле описания меню my_description_menu.xml задали у элемента значок (android:icon) , то после выполнения кода
refreshItem.setActionView(null);
Элемент покажет заданную в разметке иконку.
А код refreshItem.setVisible(false); скрывает элемент из меню.
Чтобы реализовать саму кнопку, нужно написать метод фрагмента:

@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.download_pb:
			// тут нужный код
			return true;
		}
		return true;
	}

В итоге мы можем легко включить и выключить индикатор прогресса в нашем фрагменте, просто вызывая setProgressButtonState(true) и setProgressButtonState(false).

Нашли ошибку в тексте?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *