Изменение вида пункта меню на панели действий - PullRequest
7 голосов
/ 30 марта 2012

Я пытаюсь реализовать кнопку обновления в моем приложении, чтобы позволить пользователю вручную выполнить повторную синхронизацию с веб-сервером. Код работает, но у меня возникают проблемы с определением представлений действий (по крайней мере, я думаю, что это то, что я должен использовать).

Мой пункт меню здесь:

<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, и это не позволило ему сразу же появиться. Однако, когда я нажимаю кнопку обновления, значок исчезает (хорошо), как и заголовок на панели действий, и индикатор 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 также отображал в течение этого времени), и после этого смог бы вернуть его в статический значок.

Я пытался прочитать этот вопрос , но мне трудно понять, что означает ответ. Я чувствую, что пытаюсь сделать именно то, что написано, но, наверное, нет. Любая помощь очень ценится.

Редактировать: По предложению шастракси.

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 View.

Редактировать 2: У меня возникли проблемы с ссылкой на пункт меню вообще.

MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
refresh.setVisible(false);

Также дает мне нулевой указатель, когда я пытаюсь установить видимость. Что не так с моими ссылками?

Ответы [ 3 ]

0 голосов
/ 17 марта 2016

Попробуйте использовать:

<item
    android:id="@+id/main_menu_refresh"
    android:enabled="true"
    android:icon="@drawable/refresh"
    android:orderInCategory="1"
    android:title="@string/refresh"
    app:showAsAction="ifRoom"
    app:actionViewClass="android.widget.ProgressBar">
</item>

Обратите внимание на две строки:

    app:showAsAction="ifRoom"
    app:actionViewClass="android.widget.ProgressBar"
0 голосов
/ 27 августа 2016

Вы пытались получить свой пункт меню, как это?

MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST);
0 голосов
/ 30 марта 2012

Вместо того, чтобы устанавливать класс представления действий в ProgressBar, установите его в пользовательский класс LinearLayout, например:

class MyViewItem extends LinearLayout

Добавьте ProgressBar и ImageView в качестве дочерних элементовв своем конструкторе с addView и установите видимость этих детей как GONE или VISIBLE, когда ваш код требует этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...