2012-08-31 67 views
2

我需要自定義附加到操作項目的下拉菜單。我設法爲主圖標做了同樣的事情,但它看起來與其他操作項目完全不同。從操作項目(actionbarsherlock)自定義下拉菜單

我知道這個問題和回答:How to add a Dropdown item on the action bar 我的問題是,我想完全自定義它(我使用自定義字體,還需要圖標),這樣子菜單是不夠的,我想。附加一個自定義Spinner作爲actionLayout看起來沒有像下降。

對於家庭的圖標,它看起來像這樣:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    ArrayList<NavItem> data = new ArrayList<NavItem>(); 
    data.add(...); 
    data.add(...); 
    ActionBarNavAdapter adapter = new ActionBarNavAdapter(...); 
    actionBar.setListNavigationCallbacks(adapter, new OnNavigationListener() {...}); 

而且我可以添加自己的設計,它在不犧牲「下拉」的事情。 如何做到這一點與其他行動項目?

編輯: 我使用NAVIGATION_MODE_LIST使用Spinner(ListNavigationCallbacks使用SpinnerAdapter)知道該活動,但它看起來更好,我不知道從哪裏得到所有這些樣式(如果它只是),使它看起來像那樣。我的意思是:

- >如何NAVIGATION_MODE_LIST看起來:這是包裝清單,它附在主頁圖標下。 不好 - >如何自定義Spinner看起來像一個actionLayout看起來:它匹配的屏幕寬度和一些額外的黑暗背景,取代了行動項目圖標(這很容易改變),最重要的是,使屏幕的其餘部分變暗。它看起來很像一個帶有自定義列表的AlertDialog,而不是一個下拉菜單。

代碼:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    MenuItem sortItem = menu.findItem(R.id.sort); 
    Spinner spinner = new Spinner(this); 

    //this is the same adapter because I didn't want to spend time creating a new one 
    //ActionBarNavAdapter extends SpinnerAdapter of course 
    ArrayList<NavItem> data = new ArrayList<NavItem>(); 
    data.add(...); 
    data.add(...); 
    ActionBarNavAdapter adapter = new ActionBarNavAdapter(...); 
    spinner.setAdapter(adapter); 
    sortItem.setActionView(spinner); 
    return true; 
} 
+0

考慮到你認爲「下拉」*是* Spinner,Spinner看起來就像是一個Spinner。您可以通過在層次結構視圖中使用'NAVIGATION_MODE_LIST'查看活動來說明這一點。也許你可能會考慮編輯你的問題來提供給你不喜歡的結果的源代碼。 – CommonsWare

+0

感謝您的評論。我用代碼更新了我的問題,並解釋了我不喜歡Spinner的內容。 –

回答

3

嘗試更換:

Spinner spinner = new Spinner(this); 

有:

Spinner spinner = new Spinner(getActionBar().getThemedContext()); 

這將使用爲主題,以配合操作欄Context,並應幫助。

+1

不幸的是沒有什麼改變。我使用了'getSupportActionBar()',因爲它是ActionBarSherlock庫。 –

+0

@MichałK:對於ActionBarSherlock,AFAIK,Jake正在使用的是'com.actionbarsherlock.internal.widget.IcsSpinner'或'com.actionbarsherlock.internal'套件中的其他內容。這不是ActionBarSherlock公共API的一部分。您需要克隆該代碼和任何必要的資源(以防他以不適合您的方式更改其實施),並安排在需要的地方使用。 「需要的地方」肯定會包含API等級10及以下,也可能包含11-13。如果您嘗試在ICS/JB上運行我的建議,我認爲它可能像廣告一樣工作。 – CommonsWare

+0

Duh,看起來像很多工作要做...也許用自定義的ActionProvider會更容易一些?類似ShareActionProvider。我只是不知道從哪裏開始(無論如何,這是一個好主意) –