Кнопка ActionBar Mic (Голосовой поиск) в SearchView

Я реализую Action Bar . Я хочу 2 кнопки в области поля поиска панели Action Bar SearchView как приложение Flipkart.

Приложение Flipkart имеет две кнопки в SearchView

Как и на скриншоте, я хочу две кнопки, первая для голосового поиска, а другая – для сканера штрих-кода, когда появляется значок поиска и SearchView Actionbar SearchView Actionbar . Я могу реализовать actionbar serahcview с помощью значка поиска. Но я немного смущен, почему голосовой поиск не появляется в моем приложении. Посмотрите мой исходный код.

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); setSearchTextColour(searchView); setCloseSearchIcon(searchView); return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.action_search: return true; default: return super.onOptionsItemSelected(item); } } private void setSearchTextColour(SearchView searchView) { int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null); EditText searchPlate = (EditText) searchView.findViewById(searchPlateId); searchPlate.setTextColor(getResources().getColor(R.color.novoda_blue)); // searchPlate.setBackgroundResource(R.drawable.edit_text_holo_light); searchPlate.setImeOptions(EditorInfo.IME_ACTION_SEARCH); } private void setCloseSearchIcon(SearchView searchView) { try { Field searchField = SearchView.class.getDeclaredField("mCloseButton"); searchField.setAccessible(true); ImageView closeBtn = (ImageView) searchField.get(searchView); closeBtn.setImageResource(R.drawable.action_cancel); searchField = SearchView.class.getDeclaredField("mVoiceButton"); searchField.setAccessible(true); ImageView voiceBtn = (ImageView) searchField.get(searchView); voiceBtn.setImageResource(R.drawable.ic_launcher); } catch (NoSuchFieldException e) { Log.e("SearchView", e.getMessage(), e); } catch (IllegalAccessException e) { Log.e("SearchView", e.getMessage(), e); } } 

Снимок экрана о том, что я получил от кода выше:

Вывод кода выше

Любая помощь будет высоко оценен.

Во-первых, вы должны прочитать это

AndroidManifest.xml для вашей деятельности с помощью виджета viewview (требуется однократное нажатие, пожалуйста, прочитайте ссылку выше):

 <activity android:name=".activities.MainActivity" android:configChanges="orientation|screenSize" android:launchMode="singleTop" > <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> </activity> Размер <activity android:name=".activities.MainActivity" android:configChanges="orientation|screenSize" android:launchMode="singleTop" > <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> </activity> 

Создайте … / res / xml / searchable.xml с помощью этого:

 <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/hint" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"/> 

Изменить onCreateOptionsMenu (последние две строки – это вопрос)

 public boolean onCreateOptionsMenu(Menu menu) { this.menu = menu; MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.main_action_bar_menu, menu); MenuItem searchItem = menu.findItem(R.id.action_search); searchView = (SearchView) searchItem.getActionView(); searchView.setQueryHint(getResources().getString(R.string.hint)); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); } 

И, наконец, переопределить onNewIntent () :

 @Override protected void onNewIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doSearch(query); } } 

После этих изменений вы увидите кнопку микрофона в режиме поиска.

Пожалуйста, проверьте свой код, если вы не звонили:

  searchView.setIconifiedByDefault(true) 

Удалив его, вы увидите значок «голос».

Просто поставьте android:launchMode="singleTop" в теге активности вашего манифеста

 <activity android:name=".Activity.MainActivity" android:launchMode="singleTop" > .... <intent-filter> <action android:name="android.intent.action.SEARCH"></action> </intent-filter> <meta-data android:name="android.app.default_searchable" android:value=".Activity.MainActivity" ></meta-data> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"> </meta-data> </activity>