2012-03-30 70 views
5

我試圖在我的應用中實現刷新按鈕,以允許用戶手動重新同步到Web服務器。代碼有效,但我無法弄清楚操作視圖(至少,我認爲這就是我應該使用的)。在操作欄中更改菜單項的視圖

我的菜單項是在這裏:

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

的問題是,它總是顯示進度。我想知道它是否像搜索部件(我真正看到的唯一示例)一樣工作,並將collapseActionView標記添加到showAsAction,並且阻止它立即顯示。但是,當我單擊刷新按鈕時,圖標消失(良好),但操作欄中的標題也會消失,並且ProgressBar會出現在標題以前的窗口左側。也不是我想要的。

作爲最後的努力的東西,我試圖把它添加到我的代碼,並從XML刪除actionViewClass

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 2013-01-29 10:57:19

+0

我想通了。我發現此前[SO](http://stackoverflow.com/questions/7142722/replacing-an-action-bar-menu-item-icon-with-an-indeterminate-progressbar)的問題。從那裏,我發現代碼谷歌寫這樣做[這裏](http://developer.android.com/resources/samples/ActionBarCompat/src/com/example/android/actionbarcompat/ActionBarHelperHoneycomb.html)。它基本上是複製和粘貼在那個點上,並且完美地工作。 – 2012-03-30 17:23:11

回答

0

而不是你的動作視圖類設置爲ProgressBar的,將其設置爲自定義LinearLayout類,例如:

class MyViewItem extends LinearLayout 

添加ProgressBarImageView在其與addView構造的孩子,並設置這些當您的代碼需要時,兒童的可見度爲GONEVISIBLE

+0

我無法理解。你能給我一點關於這個習俗課的更多細節嗎?我在主帖中添加了更多內容,以顯示我遇到的問題。 – 2012-03-30 02:20:01

+0

您需要在XML中使用完全限定的名稱,例如'com.mydomain.mypackage.IconSwitcher',而不僅僅是'IconSwitcher'。試試看,看看事情是否開始奏效。 – sastraxi 2012-03-30 02:30:49

+0

不,我仍然有一個空指針錯誤。它也絕對在'IconSwitcher ic =(IconSwitcher)refresh.getActionView();'行上。如果我評論這條線,我沒有得到任何錯誤,但我顯然沒有得到一個動態按鈕,只是靜態圖標。我需要以任何方式在清單中聲明IconSwitcher嗎? – 2012-03-30 02:48:39

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