2012-03-30 2 views
5

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

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

<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); 

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

+0

Это не происходит в setActionView, но в точке, где вы делаете (MenuItem) findViewById (R.id.main_menu_refresh). По-видимому, это ClassCastException, чтобы придать ActionItemView в MenuItem. – Namratha

+0

Я понял. Я нашел этот предыдущий вопрос [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). Это было в основном копирование и вставка в этот момент, и работает отлично. –

ответ

0

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

class MyViewItem extends LinearLayout 

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

+0

У меня возникли проблемы с пониманием. Можете ли вы дать мне более подробную информацию об этом обычном классе? Я добавил больше к основному сообщению, чтобы показать, с чем я столкнулся. –

+0

Вам необходимо использовать полное имя в XML, например. 'com.mydomain.mypackage.IconSwitcher', а не просто' IconSwitcher'. Попробуйте это, посмотрите, начнете ли работать. – sastraxi

+0

Нет, у меня все еще есть ошибка с нулевым указателем. Это также определенно в строке 'IconSwitcher ic = (IconSwitcher) refresh.getActionView();'. Если я прокомментирую эту строку, я не получаю никаких ошибок, но я, очевидно, не получаю динамическую кнопку, а только статический значок. Мне нужно каким-либо образом объявить IconSwitcher в манифесте? –

0

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

<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

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

MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST); 
Смежные вопросы