2013-03-15 304 views
20

如何構建ActionBar帶可摺疊搜索視圖,單個操作項目可見,當搜索視圖展開時?爲了更好的描述,這是我需要的:Android ActionBar:可摺疊的搜索查看與動作按鈕

enter image description here 注意,還有其他的菜單項和android:uiOptions="splitActionBarWhenNarrow"AndroidManifest.xml定義。

我試圖建立自定義搜索項目佈局:

menu.xml文件

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/search" /> 

actionbar_search.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right" 
    android:orientation="horizontal" > 

    <com.actionbarsherlock.widget.SearchView 
     android:id="@+id/search_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:iconifiedByDefault="false" 
     android:queryHint="@string/search_hint" /> 

    <ImageButton 
     android:id="@+id/add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/Widget.Sherlock.ActionButton" 
     android:src="@drawable/content_new"/> 

</LinearLayout> 

但默認情況下將t搜索視圖採用所有可用的寬度,並且按鈕不可見。我不知道如何強制SearchView填充應用程序圖標和菜單項之間的所有可用空間。我發現的所有內容都是android:maxWidth屬性,但這隻允許硬編碼維度,而我正在尋找更靈活的解決方案。我也嘗試RelativeLayoutandroid:layout_toRightOf="@id/search_view"沒有運氣。

回答

9

考慮從意見建議後,許多谷歌搜索和測試成功獲得預期的效果。我對這個解決方案並不感到自豪,但它的工作原理並不複雜,對於這種情況應該足夠了。

在簡歷我所做的:

  1. 放置SearchView與風俗的ActionBarcustomView 「添加項目」 按鈕。
  2. menu.xml
  3. 刪除collapseActionViewandroid:actionLayout從搜索項摺疊/展開SearchView編程。

一些代碼,以更好地瞭解我做了什麼。也許這可能對某人有用。

menu.xml文件

<item 
    android:id="@+id/menu_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always" 
    android:title="@string/search" /> 

// ... other menu items 

actionbar_search.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right" 
    android:orientation="horizontal"> 

    <com.actionbarsherlock.widget.SearchView 
     android:id="@+id/search_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:iconifiedByDefault="false" 
     android:queryHint="@string/search_hint" 
     android:visibility="invisible" /> 

    <ImageButton 
     android:id="@+id/add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/Widget.Sherlock.ActionButton" 
     android:src="@drawable/content_new" 
     android:title="@string/add_item" /> 

</LinearLayout> 

MainActivity。java的

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // ... 
    actionBar.setCustomView(R.layout.actionbar_search); 
    actionBarCustomView = ab.getCustomView(); 
    searchView = ((SearchView) actionBarCustomView.findViewById(R.id.search_view)); 
    searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
     @Override 
     public boolean onClose() { 
      searchView.setVisibility(View.INVISIBLE); 
      return false; 
     } 
    }); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // ... 
     case R.id.menu_search: 
      if (searchView.getVisibility() == View.VISIBLE) { 
       searchView.setIconified(true); 
       searchView.setVisibility(View.INVISIBLE); 
      } else { 
       searchView.setMaxWidth(abCustomView.getWidth() - addButton.getWidth()); 
       searchView.setVisibility(View.VISIBLE); 
       searchView.setIconified(false); 
      } 
      break; 
     // ... 
    } 
    return true; 
} 

@Override 
public void onBackPressed() { 

    if (searchView.getVisibility() == View.VISIBLE) { 
     searchView.setIconified(true); 
     searchView.setVisibility(View.INVISIBLE); 
     return; 
    } 

    // ... 
} 
+0

嗨,我已經嘗試過你的上述解決方案,但它根本不工作。事實上,我無法看到任何行動項目。 – AndoAiron 2013-04-11 10:37:06

+0

你可以發佈你的代碼片段(例如,作爲要點)嗎?我花了幾天時間搞清楚和測試,認爲我可以提供幫助。 – 2013-04-12 11:14:00

+0

我應該在哪裏發佈我的代碼片段?我不能在這裏發佈我的問題代碼作爲評論。 另外,你可以請幫我實現這一點: http://stackoverflow.com/questions/15947557/sherlockactionbar-with-autocompletetextview-and-other-items?noredirect=1#comment22723847_15947557 – AndoAiron 2013-04-15 06:07:47

2

只能使用yourmenu.xml來完成。

將您的其他菜單圖標設置爲始終顯示爲一個操作。 你menu.xml文件應該是這樣的:

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/search" 
/> 
<item 
    android:id="@+id/your_other_menu_id" 
    android:showAsAction="always" 
    android:icon="@android:drawable/your_other_menu_ic" 
/> 
+0

試過這種方法。正如我所提到的,還有其他的菜單項,它們都溢出到底部的操作欄。我需要這個添加動作始終放在右上角。 – 2013-03-15 07:35:26

+1

這種情況下的細節是拆分操作欄,而不是可摺疊搜索視圖。 檢查下面的鏈接。使用本機對象設置此行爲是不可能的。您需要創建自己的自定義操作欄。 http://stackoverflow.com/questions/8571754/android-split-action-bar-with-action-items-on-the-top-and-bottom – JPMagalhaes 2013-03-15 21:34:39

+0

感謝您的建議,但我已經嘗試過這一個。當SearchView摺疊時,自定義ActionBar爲我提供自定義視圖。然後,我在頂部欄中有我的單個按鈕,底部是那些形式爲menu.xml的菜單。 問題是當SearchView展開時。我需要強制它填充應用程序圖標和單個操作項目之間的所有可用空間。我嘗試瞭解SearchView類的'onMeasure()'中發生了什麼,但不完全明白我可以用這個做什麼,如果它完全是正確的方向。任何幫助,將不勝感激。 – 2013-03-15 22:59:34

1

只要你能做到這樣

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
    searchView.setIconified(true); //to be opened collapsed 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()){ 

     case R.id.action_search: 
      searchView.setIconified(false);// to Expand the SearchView when clicked 
      return true; 
    }  
    return false; 
} 

而在搜索項中menu.xml文件使

showAsAction = 「總是」

注意:我正在使用android.support.v7.widget.SearchView,但在你的情況下,沒關係

+1

對我不起作用:(( – 2014-09-02 01:22:14

+0

)這段代碼是否被棄用? – HMagdy 2015-08-12 16:52:59

+0

@salma是的,你是正確的android.support.v7.widget.SearchView和android.widget.searchview它的事情很多 – 2015-11-05 05:26:41

0

只需更改菜單xml。 showaction前綴到您的應用程序名稱

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" > 

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    app:showAsAction="always|collapseActionView" 
    android:title="@string/search" 
/> 

</menu>