2013-09-11 3 views
12

enter image description hereКак заставить панель поиска SearchView заполнить всю панель действий?

Я пытался создать в своем приложении к action bar search, но в развернутом состоянии SearchView не принимают всю ширину действия бара (он все еще показывает другие действия)!

Итак, как сделать SearchView заполнить полную область ActionBar (как в приложении GMAIL)?

+0

использование ActionBarSherlock .. –

+0

Проверьте свой ответ на этот вопрос: HTTP: //stackoverflow.com/questions/13660225/how-to-make-search-menu-item-to-a-full-view-in-the-action-bar-using-abs/18648708#18648708 – Szymon

+0

Я создаю это приложение для 4.0 и выше, поэтому я не думаю, что мне нужно использовать actionBarSherLock! Есть ли способ сделать это в обычном actionBar? – user2364935

ответ

9

Понял

enter image description here

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

    MenuItem searchViewItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) searchViewItem.getActionView(); 
    searchView.setIconifiedByDefault(false); 
    ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT); 
    searchView.setLayoutParams(params); 
    searchViewItem.expandActionView(); 
    return true; 
} 


<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     tools:context=".MySwipeTabbedActivity" > 
    <item android:id="@+id/action_search" 
      android:title="Search" 
      android:icon="@android:drawable/ic_menu_search" 
      android:showAsAction="always|collapseActionView" 
      android:actionViewClass="android.widget.SearchView" 
      /> 
    <item android:id="@+id/action_share" 
      android:title="Share" 
      android:icon="@android:drawable/ic_menu_share" 
      android:showAsAction="ifRoom" /> 
    <item android:id="@+id/action_settings" 
      android:title="Settings" 
      android:icon="@android:drawable/ic_menu_preferences" 
      android:showAsAction="never" /> 
</menu> 

[Необязательно] Избегайте SearchView от коллапса:

searchViewItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { 
     @Override 
     public boolean onMenuItemActionExpand(MenuItem item) { 
      return true; 
     } 

     @Override 
     public boolean onMenuItemActionCollapse(MenuItem item) { 
      return false; //never collapse 
     } 
    }); 
+2

. Ваш ответ работает на меня :) один добавочный n для этого ответа заключается в том, что для избежания рушиться, когда мы используем приложение compact lib, это должно быть как это MenuItemCompat.setOnActionExpandListener (searchViewItem, new OnActionExpandListener() ....... иначе приложение будет разбиваться – Ramz

+2

Чтобы добавить к этому, если вы используете новый API панели инструментов, вы должны изменить его на: final ActionMenuView.LayoutParams lp = new ActionMenuView.LayoutParams (ActionMenuView. LayoutParams.MATCH_PARENT, ActionMenuView.LayoutParams.MATCH_PARENT); –

+0

@Ramz Это не работает для меня. Я попробовал это [в этом SSCCE] (http://stackoverflow.com/questions/31994512/how-to-make-the-distance -between-left-edge-of-toolbar-and-search-icon-same-as-th), но не работает. Я буду очень признателен, если вы сможете изучить его. – Solace

2

Ответ дается @Hiep правильно я следую тем шагам, чтобы получить мое решение .but я использовал ActionbarCompact lib, поэтому нужно внести некоторые изменения, чтобы заставить его работать Это решение является только измененным анвью ЭВ Hiep, если вы используете appcompact

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:materialdesign="http://schemas.android.com/apk/res-auto" > 

<item android:id="@+id/action_search" 
     android:title="search" 
     android:icon="@drawable/abc_ic_search_api_mtrl_alpha" 
     materialdesign:showAsAction="always|collapseActionView" 
     materialdesign:actionViewClass="android.support.v7.widget.SearchView" /> 

</menu> 

И в главном классе onCreateOptionsMenu

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.my_swipe_tabbed, menu); 

    MenuItem searchItem = menu.findItem(R.id.action_search); 

    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 



    // Get the SearchView and set the searchable configuration 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 

    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 


    ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT); 
    searchView.setLayoutParams(params); 
    searchView.setIconified(false); 

    MenuItemCompat.expandActionView(searchItem); 

    return super.onCreateOptionsMenu(menu); 
} 

Избегайте SearchView от коллапса: Если и использовать вышеупомянутый метод в Appcompact создаст аварию поэтому используйте это решение, чтобы этого избежать.

 MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { 

     /* (non-Javadoc) 
     * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionExpand(android.view.MenuItem) 
     */ 
     @Override 
     public boolean onMenuItemActionExpand(MenuItem item) { 

      return true; 
     } 

     /* (non-Javadoc) 
     * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionCollapse(android.view.MenuItem) 
     */ 
     @Override 
     public boolean onMenuItemActionCollapse(MenuItem item) { 

      return false; 
     } 
    }); 

Спасибо

22

Ни одно из вышеперечисленных решений не работает для меня. Установка MaxWidth в SearchView работал для меня:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_search, menu); 
    SearchView searchView = (SearchView)menu.findItem(R.id.menu_search).getActionView(); 
    searchView.setMaxWidth(Integer.MAX_VALUE); 
+0

Это имеет недостаток, что даже кнопка меню переполнения исчезает на уровне API 23. Протестировано в эмуляторе. – cgogolin

+0

hm Это странный вопрос, потому что я хочу сделать наоборот, и поведение по умолчанию для меня сейчас является максимальным значением ... – CQM

0

Попробуйте это только будет работать и держать все другие элементы, установленные в ifRoom

<item 
    android:id="@+id/action_search" 
    app:actionViewClass="android.support.v7.widget.SearchView" 
    android:title="@string/action_search" 
    app:showAsAction="always"/> 
Смежные вопросы