Активность в Android-активности в одиночной деятельности

Я пытаюсь сделать мое приложение состоящим из одной активности. Это действие должно быть в состоянии создать поиск, а также получить поиск. К сожалению, я получаю «двойную» строку поиска в моем SearchView, когда я нажимаю кнопку поиска в панели действий. Я имею в виду, что есть панель поиска (темный – SearchView), которая появляется на секунду в панели действий, а затем появляется вторая (белая) над панелью действий. Любая помощь? Что я делаю не так? Извините, эта поисковая вещь все новая и запутанная для меня.

MainActivity (единственное действие):

public class MainActivity extends ActionBarActivity { Menu mMenu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //getSupportActionBar().setDisplayShowTitleEnabled(false); setContentView(R.layout.activity_main); handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); //use the query to search your data somehow } } @SuppressLint("NewApi") @Override public boolean onCreateOptionsMenu(Menu menu) { mMenu = menu; // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.search: onSearchRequested(); return true; default: return false; } } @SuppressLint("NewApi") @Override public boolean onSearchRequested() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { MenuItem mi = mMenu.findItem(R.id.search); if(mi.isActionViewExpanded()){ mi.collapseActionView(); } else{ mi.expandActionView(); } } else{ //onOptionsItemSelected(mMenu.findItem(R.id.search)); } return super.onSearchRequested(); } } 

Main.xml (меню xml):

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:com.brianco.andypedia="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/search" android:title="@string/action_settings" android:icon="@drawable/ic_launcher" android:actionProviderClass="android.support.v7.widget.ShareActionProvider" com.brianco.andypedia:showAsAction="always|collapseActionView" com.brianco.andypedia:actionViewClass="android.support.v7.widget.SearchView" /> <item android:id="@+id/action_settings" android:orderInCategory="100" android:showAsAction="never" android:title="@string/action_settings"/> </menu> 

searchable.xml:

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" /> 

В манифесте:

 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light.DarkActionBar" > <activity android:name="com.brianco.andypedia.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> <meta-data android:name="android.app.default_searchable" android:value=".MainActivity" /> 

От настройки интерфейса поиска в документации на Android:

В своей поисковой деятельности обработайте намерение ACTION_SEARCH, проверив его в вашем методе onCreate ().

Примечание. Если ваша поисковая активность запускается в режиме с одним верхним (android: launchMode = «singleTop»), также обрабатывайте намерение ACTION_SEARCH в методе onNewIntent (). В режиме с одним верхним режимом создается только один экземпляр вашей активности, а последующие вызовы для запуска вашей деятельности не создают новую активность в стеке. Этот режим запуска полезен, поэтому пользователи могут выполнять поиск с одного и того же действия без создания нового экземпляра активности каждый раз.

Попробуйте добавить в свой файл манифеста следующий атрибут <activity> :

 android:launchMode="singleTop" 

Это приведет к тому, что такая же активность получит намерение поиска.

Подробнее здесь: http://developer.android.com/guide/topics/manifest/activity-element.html

Кроме того, вы дважды объявляете <intent-filter> , вы должны объединить его в один элемент.

Хорошо, проблема связана с вызовом onSearchRequested () в onOptionsItemSelected (элемент MenuItem). Это избыточно, когда у меня есть SearchView и вызывается только на старых платформах.

Итак, я создал отдельный пункт меню для устройств под Honeycomb. Он удаляется во время выполнения для новых устройств. SearchView удаляется во время выполнения для более старых устройств.

См. Обновленный код ниже:

 @SuppressLint("NewApi") @Override public boolean onCreateOptionsMenu(Menu menu) { mMenu = menu; // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { //remove old menu.removeItem(R.id.search_old); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); } else{ //remove new menu.removeItem(R.id.search); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.search_old: onSearchRequested(); return true; default: return false; } } @SuppressLint("NewApi") @Override public boolean onSearchRequested() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { MenuItem mi = mMenu.findItem(R.id.search); if(mi.isActionViewExpanded()){ mi.collapseActionView(); } else{ mi.expandActionView(); } } else{ //onOptionsItemSelected(mMenu.findItem(R.id.search)); } return super.onSearchRequested(); }