2012-12-01 24 views
3

我在操作欄中的五個行動的菜單項,其中我使用操作欄福爾摩斯庫如下使搜索菜單項,在動作條的完整視圖:如何使用ABS

onCreateOptionsMenu(),我用下面的代碼:

menu.add(0,1,0 "Settings") 
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    menu.add(0,2,0 "Favorites") 
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    menu.add(0,3,0 "List") 
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    menu.add(0,4,0 "Upload") 
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    menu.add(0,5,0 "Search") 
    .setActionView(R.layout.search_layout) 
    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

現在我的問題是,搜索編輯文本(這是紅色)出現這樣的: Search edit text appears like this

我想使它在動作條的完整視圖,像這樣:

​​

+1

您正在將其他項目設置爲「SHOW_AS_ACTION_ALWAYS」,顯然沒有足夠的空間留下可摺疊搜索項目。 –

+0

它不起作用 – RajeshVijayakumar

回答

6

這個問題是有點老,但我會盡量嘗試回答。我希望有人會覺得它有用。

這裏是我做了什麼:

創建一個擴展搜索查看自定義SearchView類。它定義了2個事件:一個在搜索視圖展開時觸發,另一個在崩潰時觸發。

public class EnglishVerbSearchView extends SearchView { 

OnSearchViewCollapsedEventListener mSearchViewCollapsedEventListener; 
OnSearchViewExpandedEventListener mOnSearchViewExpandedEventListener; 

public EnglishVerbSearchView(Context context) { 
    super(context); 
} 

@Override 
public void onActionViewCollapsed() { 
    if (mSearchViewCollapsedEventListener != null) 
     mSearchViewCollapsedEventListener.onSearchViewCollapsed(); 
    super.onActionViewCollapsed(); 
} 

@Override 
public void onActionViewExpanded() { 
    if (mOnSearchViewExpandedEventListener != null) 
     mOnSearchViewExpandedEventListener.onSearchViewExpanded(); 
    super.onActionViewExpanded(); 
} 

public interface OnSearchViewCollapsedEventListener { 
    public void onSearchViewCollapsed(); 
} 

public interface OnSearchViewExpandedEventListener { 
    public void onSearchViewExpanded(); 
} 

public void setOnSearchViewCollapsedEventListener(OnSearchViewCollapsedEventListener eventListener) { 
    mSearchViewCollapsedEventListener = eventListener; 
} 

public void setOnSearchViewExpandedEventListener(OnSearchViewExpandedEventListener eventListener) { 
    mOnSearchViewExpandedEventListener = eventListener; 
} 

} 

在我的活動,我做了以下內容: - 創建一個私有字段存儲的參考菜單。 - 定義摺疊和展開搜索視圖的事件,其中我隱藏並顯示其他操作,方法是使用對菜單的引用。

public class DictionaryActivity extends ActionBarActivity { 

    private Menu mMenu; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.dictionary, menu); 

    MenuItem searchItem = menu.findItem(R.id.action_search); 
    EnglishVerbSearchView searchView = (EnglishVerbSearchView) MenuItemCompat.getActionView(searchItem);   

    searchView.setOnSearchViewCollapsedEventListener(listenerCollapse); 
    searchView.setOnSearchViewExpandedEventListener(listenerExpand); 

    mMenu = menu; 

    return super.onCreateOptionsMenu(menu); 
} 

final private OnSearchViewCollapsedEventListener listenerCollapse = new OnSearchViewCollapsedEventListener() { 

    @Override 
    public void onSearchViewCollapsed() { 
     // show other actions 
     MenuItem favouriteItem = mMenu.findItem(R.id.action_favourite); 
     MenuItem playItem = mMenu.findItem(R.id.action_play); 
     favouriteItem.setVisible(true); 
     playItem.setVisible(true); 

     // I'm doing my actual search here   
    } 
}; 

final private OnSearchViewExpandedEventListener listenerExpand = new OnSearchViewExpandedEventListener() { 

    @Override 
    public void onSearchViewExpanded() { 
     // hide other actions 
     MenuItem favouriteItem = mMenu.findItem(R.id.action_favourite); 
     MenuItem playItem = mMenu.findItem(R.id.action_play); 
     favouriteItem.setVisible(false); 
     playItem.setVisible(false); 
    } 
}; 

} 

在menu.xml文件的文件,我使用的自定義搜索視圖:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 
<item android:id="@+id/action_search" 
     android:title="@string/action_search" 
     android:icon="@drawable/action_search" 
     yourapp:showAsAction="always|collapseActionView" 
     yourapp:actionViewClass="com.xxx.EnglishVerbSearchView" /> 
</menu> 

我希望這是所有的需要,因爲它只是從我的活動的全碼的提取物。如果有任何遺漏,請告訴我。


按照從arne.jans評論:

這似乎是不夠的做MenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);,以騰出空間SearchView。優點是:其他菜單項進入溢出菜單並且仍然可以訪問,即使打開了SearchView也是如此。

+2

感謝您的支持!只是一個註釋:它似乎足以做 MenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 爲SearchView騰出空間。優點是:即使打開了SearchView,其他菜單項也會進入溢出菜單並仍然可以訪問。 –

+0

@ arne.jans謝謝!我將它添加到我的答案中,謝謝你的改進。 – Szymon

+0

如果我使用自己的方法,那麼應用程序將崩潰,並在運行Android 4.0-4.1.2的某些設備上的activity.onCreateOptionsMenu中訪問null searchView。 你也有這個問題嗎? 就在這個NPE之前,該日誌顯示以下異常作爲警告(這很奇怪,因爲我肯定有PARAM上下文正確的公共構造函數): java.lang.reflect.InvocationTargetException \t在java.lang中。 reflect.Constructor.constructNative(Native Method) \t at java.lang.reflect.Constructor.newInstance(Constructor.java:417) –