2015-09-29 2 views
1

У меня есть меню в моей панели действий с двумя элементами. После открытия поиска по-прежнему отображается «кусок пера». Как я могу скрыть это?Панель действий - скрытие всех пунктов меню, кроме поля поиска

menu.xml:

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

    <item 
     android:id="@+id/search" 
     android:title="@string/search" 
     android:icon="@drawable/ic_search" 
     app:actionViewClass="android.widget.SearchView" 
     app:showAsAction="ifRoom|withText" /> 

    <item 
     android:id="@+id/edit" 
     android:icon="@drawable/ic_edit" 
     android:title="@string/edit" 
     app:showAsAction="ifRoom|withText" /> 

</menu> 

ActionBar: search closed

ActionBar с видом поиска открыл: search open

Я попытался также:

app:showAsAction="collapseActionView|ifRoom" 

Но в этом случай у меня есть:

collapseActionView

Я хочу, чтобы получить то же самое, что представлено на втором рисунке. Но значок редактирования должен быть скрытым или в конечном итоге отображаться, но в целом.

EDIT

Based @Ahmad Alsanie ответа я написал н так:

SearchView view = (SearchView) menu.findItem(R.id.search).getActionView(); 
view.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
    if (hasFocus) 
     menu.findItem(R.id.edit).setVisible(false); 
}); 

И это работает, но как я могу восстановить редактирования значка после закрытия вида поиска? Я пробовал setOnCloseListener, но безуспешно.

+0

взгляд на эту ссылку http://www.edumobile.org/android/action-bar-search-view/ –

+0

Thx, я пробовал, но это то же самое, что у меня на третьей картинке (только программно, без xml) – Bakus123

+0

извините, я попробовал :( –

ответ

-2

Попробуйте использовать для второго приложения меню: showAsAction = "никогда"

+0

нет, не работает – Bakus123

+0

неверный ответ, внимательно прочитайте вопрос –

3

Сначала внутри onCreateOptionsMenu использует это:

MenuInflater inflater = getSupportMenuInflater(); 
inflater.inflate(R.menu.edit, menu); 
if (menu.getItem(1).isFocused()) //detect if search view has focus 
    { 
     //hide only option 2 which is in this case edit pen 
      menu.getItem(2).setVisible(false); 
    }else{ 
    menu.getItem(2).setVisible(true); 
    } 

затем использовать:

invalidateOptionsMenu();//to call onCreateOptionMenu again 
+0

Thx, где я должен называть 'i nvalidateOptionsMenu() '? – Bakus123

+1

вызов недействителен, если вы хотите, чтобы меню было повторно заполнено для отображения или скрытия редактирования. можно назвать любым, где в вашем классе, например, onCreate –

+0

'menu.getItem (1)' не имеет метода 'isFocused'. Я попытался использовать 'SearchView view' вместо этого, и он работает, но эффект все тот же ... – Bakus123

0

У меня был такая же проблема где я не мог правильно отображать другие значки, скрывая их. Следующие изменения работали для меня. Вы можете попробовать.

1- Попробуйте изменить ShowAsAction к "всегда"

<item 
     android:id="@+id/search" 
     android:title="@string/search" 
     android:icon="@drawable/ic_search" 
     app:actionViewClass="android.widget.SearchView" 
     app:showAsAction="always" /> 
<item 
     android:id="@+id/edit" 
     android:icon="@drawable/ic_edit" 
     android:title="@string/edit" 
     app:showAsAction="always" /> 

2- Используйте "setOnSearchClickListener", чтобы скрыть элемент управления редактирования, как:

SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
searchView.setOnSearchClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     menu.findItem(R.id.edit).setVisible(false); 
    } 
}); 

3- Используйте "setOnCloseListener" для восстановления скрытого управления как:

// Detect SearchView close 
searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
    @Override 
    public boolean onClose() { 
     menu.findItem(R.id.edit).setVisible(true); 
     return false; 
    } 
}); 

Вам не нужно будет вызывать invalidate для этого для wo гк

0

@Ahmed Авада ответить хорошо, но searchView.setOnCloseListener не работает, так что используйте MenuItemCompat.setOnActionExpandListener

menu_items.XML

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

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

    <item 
     android:id="@+id/action_sort" 
     android:title="Sort" 
     android:icon="@drawable/ic_action_sort_alphabetically" 
     app:showAsAction="always"/> 

</menu> 

активность

@Override 
    public boolean onCreateOptionsMenu(final Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_items, menu); 
     MenuItem menuItem = menu.findItem(R.id.action_search); 
     SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem); 
     searchView.setMaxWidth(Integer.MAX_VALUE); 
     searchView.setOnQueryTextListener(this); 

/*  // Hide other menu items when searchView clicked 
     searchView.setOnSearchClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       menu.findItem(R.id.action_sort).setVisible(false); 
      } 
     }); 

     // Show other menu items when SearchView closed 
     searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
      @Override 
      public boolean onClose() { 
       menu.findItem(R.id.action_sort).setVisible(true); 
       return false; 
      } 
     });*/ 

     MenuItemCompat.setOnActionExpandListener(menuItem, new MenuItemCompat.OnActionExpandListener() { 
      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 
       // Do something when collapsed 
       menu.findItem(R.id.action_sort).setVisible(true); 
       return true; // Return true to collapse action view 
      } 

      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       // Do something when expanded 
       menu.findItem(R.id.action_sort).setVisible(false); 
       return true; // Return true to expand action view 
      } 
     }); 

     return super.onCreateOptionsMenu(menu); 
    } 
Смежные вопросы