2015-10-23 2 views
1

Я работаю над Внедрение Custom search в Android App-bar. Таким образом, я добавил следующий код в menu_main.xmlПользовательский поиск в Android?

<item android:id="@+id/action_search" 
    android:title="search" 
    android:icon="@drawable/ic_search" 
    app:showAsAction="ifRoom|collapseActionView" 
    android:hint="Enter Tags" 
    app:actionViewClass="android.support.v7.widget.SearchView" /> 

Сейчас, когда я смотрю на HomeActivity. Это выглядит следующим образом:

enter image description here

Это прекрасно !. Я не реализовал бэкэнд-код выше SearchView. Теперь я хочу, чтобы добавить некоторые следующие особенности в выше Search bar

  • Пользователь может искать с помощью тегов (Поиск с помощью тегов означает, что если есть пространство между двумя словами, то я буду рассматривать их как метки). Это очень похоже на приложение Pintreset.

  • Далее я хочу получить эти теги от Search Bar и внести в Get параметр запроса.

    Скриншот

enter image description here

Вопросы

  • На данный момент, забыл о Style. Я просто хочу знать, как я могу достичь этого в моем Search Bar?
  • Как я могу добавить коробку на каждый тэг с этим крестиком в Android app bar?

Любая помощь будет заметна.

Edit-1

Я добавляю 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.menu_main, menu); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search) 
      .getActionView(); 
    if (null != searchView) { 
     searchView.setSearchableInfo(searchManager 
       .getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); 
    } 

    SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
     public boolean onQueryTextChange(String newText) { 
      // this is your adapter that will be filtered 
      return true; 
     } 

     public boolean onQueryTextSubmit(String query) { 
      //Here u can get the value "query" which is entered in the search box. 
      return true; 
     } 
    }; 
    searchView.setOnQueryTextListener(queryTextListener); 

    return super.onCreateOptionsMenu(menu); 
} 

я получаю текст представления в onCreateOptionsMenu.onQueryTextSubmit метода. Что мне теперь делать?

ответ

1

Вы должны использовать пользовательский режим поиска для доступа к панели инструментов EditText (app:actionViewClass) в макете меню). После установки TextWathcer и управления пролетами внутри afterTextChanged callback.

Я написал несколько примеров с реализацией базового фона. Это основная концепция и начальная точка в решении вашей проблемы.

смотрите пример ниже:

menu_main.xml:

<item android:id="@+id/action_search" 
    android:title="search" 
    android:icon="@drawable/ic_search" 
    app:showAsAction="ifRoom|collapseActionView" 
    android:hint="Enter Tags" 
    app:actionViewClass="your.package.CustomSearchView" /> 

CustomSearchView.java:

public class CustomSearchView extends SearchView { 

    private AutoCompleteTextView mSearchAutoComplete; 

    public CustomSearchView(Context context) { 
     super(context); 
     initialize(); 
    } 

    public CustomSearchView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initialize(); 
    } 

    public CustomSearchView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     initialize(); 
    } 

    public void initialize() { 
     mSearchAutoComplete = (AutoCompleteTextView) findViewById(android.support.v7.appcompat.R.id.search_src_text); 

     if (mSearchAutoComplete == null) { 
      Log.wtf("TEST", "Some Changes in AppCompat????"); 
      return; 
     } 
     mSearchAutoComplete.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       mSearchAutoComplete.removeTextChangedListener(this); 
       setSpans(s, Color.RED); 
       mSearchAutoComplete.addTextChangedListener(this); 
      } 
     }); 
    } 

    private void setSpans(Editable s, @ColorInt int backgroundColor) { 
     BackgroundColorSpan[] spans = s.getSpans(0, s.length(), BackgroundColorSpan.class); 

     String[] words; 
     if (s.toString().endsWith(" ")) { 
      words = (s.toString() + "X").split("\\s"); 
     } else { 
      words = s.toString().split("\\s"); 
     } 
     int completedWordsCount = words.length - 1; 
     if (spans.length != completedWordsCount) { 
      for (BackgroundColorSpan span : spans) { 
       s.removeSpan(span); 
      } 

      int currentIndex = 0; 
      for (int i = 0; i < words.length - 1; i++) { 
       s.setSpan(new BackgroundColorSpan(backgroundColor), currentIndex, currentIndex + words[i].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
       currentIndex += words[i].length() + 1; 
      } 
     } 
    } 
} 

P.S.Эта ссылка также может быть полезна для вас, чтобы установить Clickable spans - Link.

+0

Спасибо, что ответили. Будет ли 'mSearchAutoComplete = (AutoCompleteTextView) findViewById (android.support.v7.appcompat.R.id.search_src_text);' будет 'mSearchAutoComplete = (AutoCompleteTextView) findViewById (android.support.v7.appcompat.R.id.search_src_text); '? –

+0

Я не показываю 'AutoCompleteTextView'. Пользователь добавит строку с пробелами. После этого мне нужно взять эти слова и сделать запрос –

+0

@AmitPal Да, вы не показываете, но так оно реализовано в исходном коде Android. Посмотрите здесь - http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/widget/SearchView.java#116. – Oleksandr