2013-10-24 2 views
11

Я использую интерфейс поиска в andriod, и, следуя руководству android, я установил интерфейс.searchView setQuery не работает

Я создаю объект SearchableActivity, который будет обрабатывать и пользователь, вводящий результат поиска.

Теперь я сталкиваюсь с проблемой в том, что когда пользователь вводит что-то в SearchView и нажимает клавишу поиска, будет отправлен запрос requset, затем я получу строку запроса и выполняю поиск, но в этот момент текст в SearchView было изменено на значение по умолчанию SearchHit, в то время как я хочу, чтобы это была строка запроса.

Итак, я попытался использовать searchView.setQuery(query, false);, но это не сработает, в чем проблема?

Основные коды Активность:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map_activity_layout); 

    Log.d("map", "create"); 
    handleIntent(getIntent()); 
} 

public void onNewIntent(Intent intent) { 
    setIntent(intent); 
    handleIntent(intent); 
} 

private void handleIntent(Intent intent) { 
    Log.d("map", "handleIntent"); 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     //try search 
     Log.d("map", "search and set query:" + query); 
     searchView.setQuery(query, false); // reset the value in of the SearchView 
    } 
} 

AndroidManifest.xml:

<activity 
     android:name=".ui.MapActivity" 
     android:launchMode="singleTop"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 
+0

сделал и решил проблему. даже я ударил в ту же точку. –

ответ

1

кажется, что, когда цель с действий Intent.ACTION_SEARCH получен, следующий метод будет называться:

handleIntent(); 

onCreateOptionsMenu(); 

И handleIntent будет работать до onCreateOptionsMenu.

В то же время люди использовали для настройки searchView на onCreateOptionsMenu.

Это означает, что меню параметров будет повторно завышено, а searchView будет перестроено, тогда все настройки в handleIntent не будут работать.

Я думаю, что это причина.

Пожалуйста, не стесняйтесь исправить меня, если я ошибаюсь.

11

Я предлагаю вам отложить установку до петли следующего события (добавить его в очередь сообщений), так что код может выглядеть следующим образом:

private void handleIntent(Intent intent) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     final String query = intent.getStringExtra(SearchManager.QUERY); 
     searchView.post(new Runnable() { 

      @Override 
      public void run() { 
       // Important! Make sure searchView has been initialized 
       // and referenced to the correct (current) SearchView. 
       // Config changes (e.g. screen rotation) may make the 
       // variable value null. 
       searchView.setQuery(query, false); 
      } 
     }; 
    } 
} 
+3

Ответ только на то, что работал надежно – Sourabh

11

Это не работает

mSearchView.setQuery(mKeyword, true); 
    MenuItemCompat.expandActionView(mMenuSearch); 

Это делает

MenuItemCompat.expandActionView(mMenuSearch); 
    mSearchView.setQuery(mKeyword, true); 

кажется, только помнит, после того, как вы расширили представление действий. Я использую MenuItemCompat только для обратной совместимости

+2

не работал для меня, задержка сделала – Mene

+0

mSearchView.onActionViewExpanded(); mSearchView.setQuery ("", true); работал для меня – Graeme

1

нужно поместить код в посте обработчика с MenuItemCompat

inflater.inflate(R.menu.menu_my_team, menu); 
    // search manager integration for search widget 
    SearchManager searchManager = (SearchManager) getActivity() 
      .getSystemService(Context.SEARCH_SERVICE); 
    final MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
    // MenuItem helpTutorialMenuItem = menu.findItem(R.id.action_help); 
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); 

    mSearchView.setSearchableInfo(searchManager 
      .getSearchableInfo(getActivity().getComponentName())); 

    mSearchView.setQueryHint("Search by"); 

    if (!TextUtils.isEmpty(queryText)) { 
     mSearchView.post(new Runnable() { 
      @Override 
      public void run() { 
       MenuItemCompat.expandActionView(searchMenuItem); 
       mSearchView.setQuery(queryText, false); 
      } 
     }); 
    } 
    mSearchView.clearFocus(); 
+0

Это должно быть отмечено как ответ. – Max

+0

Должен вытащить 'MenuItemCompat.expandActionView (searchMenuItem);' из запуска и добавить до публикации. Это всегда работало для меня, но заметил, что это не было на устройстве Nougat, которое я тестировал. –

+0

Работал отлично – Akshay

0

В моем случае это не работает, потому что этот фрагмент я был больше не привязан к окно. Переместив его выше, где я поменялся на новый фрагмент результатов поиска, он исправил его.

Смежные вопросы