Я пытаюсь внедрить кнопку обновления в своем приложении, чтобы пользователь мог вручную повторно синхронизировать с веб-сервером. Код работает, но мне сложно разобраться в действиях (по крайней мере, я думаю, именно это я и должен использовать).Изменение вида на пункт меню в панели действий
Мой пункт меню находится здесь:
<item
android:id="@+id/main_menu_refresh"
android:enabled="true"
android:icon="@drawable/refresh"
android:orderInCategory="1"
android:showAsAction="ifRoom"
android:title="@string/refresh"
android:actionViewClass="android.widget.ProgressBar">
</item>
Проблема заключается в том, что всегда показывает ProgressBar. Я задавался вопросом, работает ли он как виджет поиска (единственный пример, который я действительно вижу в Интернете), и добавил тег collapseActionView
к showAsAction
, и это помешало ему немедленно появиться. Однако, когда я нажимаю кнопку обновления, значок исчезает (хорошо), но также заголовок Title на панели действий и ProgressBar появляется в левой части окна, где раньше было название. И не то, что я хотел.
Как-то из последних сил канавы, я попытался добавить это в мой код, и удалить actionViewClass
из XML:
MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
Log.w("MyApp", "Have Menu");
ProgressBar pb = new ProgressBar(ReadingList.this);
refresh.setActionView(pb);
Это не сработало, что дает мне ошибку пустого указателя на setActionView
.
Мне нужно решение, которое я могу вызвать из любой функции (в начале есть период автосинхронизации, который я бы хотел, чтобы ProgressBar также отображался во время), и иметь возможность вернуть его на статический значок после.
Я пробовал читать через this question, но у меня возникли проблемы с пониманием того, что означает ответ. Я чувствую, что пытаюсь сделать то, что он говорит, но, я думаю, нет. Любая помощь очень ценится.
Редактировать: Для предложения sastraxi.
public class IconSwitcher extends LinearLayout{
public IconSwitcher(Context context) {
super(context);
ProgressBar pb = new ProgressBar(context);
ImageView iv = new ImageView(context);
addView(iv);
addView(pb);
}
}
Это мой класс. Тем не менее, когда я пытаюсь использовать его с:
MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
IconSwitcher ic = (IconSwitcher) refresh.getActionView();
Я получаю ошибку с нулевым указателем. при создании IconSwitcher. Кнопка XML выглядит следующим образом:
<item
android:id="@+id/main_menu_refresh"
android:enabled="true"
android:icon="@drawable/refresh"
android:orderInCategory="1"
android:showAsAction="ifRoom"
android:title="@string/refresh"
android:actionViewClass="IconSwitcher">
</item>
Мне просто сложно найти ссылку на этот значок IconSwitcher.
Редактировать 2: У меня возникли проблемы со ссылкой на пункт меню.
MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
refresh.setVisible(false);
Также дает мне нулевой указатель, когда я пытаюсь установить видимость. Что не так с моими рекомендациями?
Это не происходит в setActionView, но в точке, где вы делаете (MenuItem) findViewById (R.id.main_menu_refresh). По-видимому, это ClassCastException, чтобы придать ActionItemView в MenuItem. – Namratha
Я понял. Я нашел этот предыдущий вопрос [SO] (http://stackoverflow.com/questions/7142722/replacing-an-actionbar-menu-item-icon-with-an-indeterminate-progressbar). Оттуда я нашел код, который Google написал на этом [здесь] (http://developer.android.com/resources/samples/ActionBarCompat/src/com/example/android/actionbarcompat/ActionBarHelperHoneycomb.html). Это было в основном копирование и вставка в этот момент, и работает отлично. –