2013-03-17 2 views
5

Я использую SearchView, и он работает нормально, но только setOnCloseListener не работает; Вот мой кодAndroid ActionBarSherlock, SearchView `setOnCloseListener` не работает

import com.actionbarsherlock.widget.SearchView.OnCloseListener; 

и

searchView.setOnCloseListener(new OnCloseListener() { 
      @Override 
      public boolean onClose() { 

       Toast.makeText(context, "close", Toast.LENGTH_SHORT).show(); 
       return false; 
      } 
     }); 

** EDIT * * **

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     //Used to put dark icons on light action bar 
     //Create the search view 
     final SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); 
     searchView.setQueryHint("Search"); 
     searchView.setIconifiedByDefault(true); 

    //search button 
    menu.add(Menu.NONE,Menu.NONE,1,"Search a word") 
     .setIcon(R.drawable.abs__ic_search_api_holo_light) 
     .setActionView(searchView) 
     .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

     MenuItem sView = menu.findItem(1); 

     sView.setOnActionExpandListener(this); 

return true; 

} 

    @Override 
    public boolean onMenuItemActionCollapse(MenuItem item) { 
     adopter.getFilter().filter(null); 
     Toast.makeText(getApplicationContext(), "collapse", Toast.LENGTH_LONG).show(); 
     return true; // Return true to collapse action view 
    } 

    @Override 
    public boolean onMenuItemActionExpand(MenuItem item) { 
     Toast.makeText(getApplicationContext(), "Expand", Toast.LENGTH_LONG).show(); 
     return true; // Return true to expand action view 
    } 
+0

Вы попробовали мой ответ? – flx

+0

нет, это не работает – Androider

+0

см. Мой отредактированный ответ, он не работает – Androider

ответ

7

Решил это самостоятельно. Просто оставьте setOnCloseListener это не будет работать, и поместить следующий код в onCreateOptionsMenu

//  searchView.setOnCloseListener(new OnCloseListener() { 
//   @Override 
//   public boolean onClose() { 
//    adapter.getFilter().filter(""); 
//    Toast.makeText(getBaseContext(), "on close", Toast.LENGTH_SHORT).show(); 
//    return false; 
//   } 
//  }); 

     MenuItem menuItem = menu.findItem(ID_OF_SEARCHVIEW); 
     menuItem.setOnActionExpandListener(new OnActionExpandListener() { 
      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       adapter.getFilter().filter(""); 
       return true; 
      } 

      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 
       adapter.getFilter().filter(""); 
       return true; 
      } 
     }); 
1

Вы можете использовать OnActionExpandListener:

public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 
    SearchView searchView = new SearchView(((SherlockFragmentActivity) getActivity()).getSupportActionBar().getThemedContext()); 
    searchView.setIconifiedByDefault(true); 
    // ... 
    MenuItem menuItem = menu.add(R.string.search); 
    // ... 
    menuItem.setOnActionExpandListener(this); 
} 

@Override 
public boolean onMenuItemActionExpand(final MenuItem item) { 
    mInSearchMode = true; 
    return true; 
} 

@Override 
public boolean onMenuItemActionCollapse(final MenuItem item) { 
    mInSearchMode = false; 
    return true; 
} 
1

Я использую этот код. И он отлично работает

@Override 
    public void onStartSearch() { 
    } 

    @Override 
    public void onSearch(String search) { 

    } 

    @Override 
    public void onCloseSearch() { 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.your_menu, menu); 

     // Associate searchable configuration with the SearchView 
     MenuItem searchItem = menu.findItem(R.id.action_search); 
     mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem); //here I user appcompat, but you can take it just from actionbarsherlock 

     SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); 
     searchAutoComplete.setTextColor(getResources().getColor(R.color.action_bar_text_color)); 

     mSearchView.setIconifiedByDefault(true); 
     mSearchView.setSubmitButtonEnabled(false); 

     /** 
     * Set all of different kinds of listeners 
     */ 
     MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { 
      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 
       menuIsOpen = false; 
       onCloseSearch(); 
       return true; 
      } 

      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       menuIsOpen = true; 
       onStartSearch(); 
       return true; 
      } 
     }); 

     mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextChange(String s) { 
       onSearch(s); 
       return false; 
      } 

      @Override 
      public boolean onQueryTextSubmit(String s) { 
       onSearch(s); 
       return true; 
      } 
     }); 

     super.onCreateOptionsMenu(menu, inflater); 
    } 

/** 
    * Function for closing search when android is less than 14 
    */ 
    public boolean onBackButton() { 
     if (AndroidUtils.getSdkVersion() >= 14) 
      return false; 

     if (menuIsOpen) { 
      menuIsOpen = false; 
      getActivity().supportInvalidateOptionsMenu(); 
      onCloseSearch(); 
      return true; 
     } 
     return false; 
    } 

После того, как backButton закроет поиск или просто откройте панель действий.

0

я столкнулся с той же проблемой с onCloseListener не ссылаясь на SearchView. Понимать от вопроса об ошибке поднятом в 25758, а некоторые комментарии, которые я прочитал, чтобы вызвать onCloseListener, вам необходимо установить:

searchView.setIconifiedByDefault(true); 

Но для моего случая я хотел бы иметь вид поиска открыл & не свернут все время. Мне удалось решить эту проблему, добавив еще одну строку ниже:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.search_bar, menu); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchView.setOnQueryTextListener(queryTextListener); 
    searchView.setIconifiedByDefault(true); 
    searchView.setIconified(false); 
    return true; 
} 

searchView.setIconified (ложь) заставит SearchView открыть, несмотря на настройки по умолчанию для свернуто истина в предыдущей строке. Таким образом, мне удалось найти и SearchView , который все время открывает &, когда он вызывает onCloseListener.