У меня возникли проблемы с последовательной анимацией значка "обновить" в ActionBar моего приложения.
У меня есть контейнер FragmentActivity, который меняет местами фрагменты, когда пользователь перемещается через приложение (либо из самого фрагмента, либо из опции SlidingMenu). Поэтому, когда приложение загружается первым, мой FragmentContainer добавляет FragA. Из FragA пользователь может перейти к FragB, который затем заменяется.
На панели действий отображается статический значок "Обновить". Когда каждый фрагмент загружается, я заменяю его анимированным символом "spinner". Когда загрузка завершится, я вернусь к исходному значку обновления.
Проблема в том, что эта анимация работает только для исходного фрагмента (в данном случае FragA). Когда пользователь переходит к FragB и выбирает значок обновления, активируется обновление, но анимация никогда не происходит. Аналогично, если для возврата к FragA нажата кнопка "Назад", это теперь следует за тем же шаблоном, то есть кнопка обновления не изменяется при нажатии.
Что нужно отметить...
- Я использую ActionBarSherlock и реализацию SlidingMenu в https://github.com/jfeinstein10/SlidingMenu. Таким образом, вышеуказанная активность фактически равна
SlidingFragmentActivity
. - Оба фрагмента вызова
setHasOptionsMenu(true)
- я отлаживал это, иonCreateOptionsMenu
правильно вызывается для каждого. - Значки отображаются правильно для обоих фрагментов - анимация просто не происходит, когда я перемещаюсь от фрагмента по умолчанию.
- Я вижу такое же поведение при использовании SlidingMenu для навигации - загрузки FragA, работы анимации → SlidingMenu используется для перехода к другому фрагменту... анимация не работает → кнопка "Назад" для FragA... анимация doesn Здесь тоже.
- Я использую
FragmentTransaction.remove()
иadd()
, а неreplace()
, поскольку ранее у меня были проблемы с кнопкамиreplace()
- я использую lib совместимости, и здесь я читаю, что реализацияreplace
немного багги - и не использовать его, конечно, исправил проблемы, которые я видел.
Ниже приведены фрагменты кода:
Мой код для загрузки исходного фрагмента - это....
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_frame, new FragA());
ft.addToBackStack(null);
ft.commit();
Чтобы "обменять" FragB на FragA....
public void switchContent(PysoBaseFragment fragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.remove(existingFragment);
ft.add(R.id.content_frame, fragment);
ft.addToBackStack(null);
ft.commit();
}
Этот метод объявляется в активности контейнера и вызывается из FragA i.e....
getFragmentContainer().switchContent(new FragB());
Код для вращения значка вызывается из нового фрагмента, когда он начинает загружаться. Его что-то вроде...
ImageView spinnerActionView = (ImageView) inflater.inflate(R.layout.refresh_action_view, null);
Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotate_animation);
rotation.setRepeatCount(Animation.INFINITE);
spinnerActionView.startAnimation(rotation);
menuItemRefresh = menu.findItem(R.id.menu_refresh);
menuItemRefresh.setActionView(spinnerActionView);
Где menu
назначается переменной экземпляра контейнера при вызове onCreateOptionsMenu
.
Обновление:
Я заметил еще одну странную ошибку в этой области (я рад добавить это как отдельный вопрос, но я обновляю ее здесь, надеясь, что она прольет некоторый свет на мою оригинальную проблему - я считаю, что оба вызваны тем, как я настроил свою панель действий из своих фрагментов).
Когда я впервые загружаю фрагмент, у меня появляется 1 статический значок обновления. Если я поворачиваю экран... появляется другой значок обновления... когда я поворачиваю экран назад, появляется третий значок обновления!
Незнакомец, нажав кнопку "назад", поочередно удаляет каждый дополнительный значок, прежде чем, наконец, (на четвертом щелчке) вернется к предыдущему экрану.