2014-01-26 74 views
5

我正在實施Action Bar。我想在Flipkart應用程序的搜索字段區域Action Bar SearchView中有2個按鈕。SearchBar中的ActionBar Mic Button(語音搜索)

Flipkart app have two buttons in SearchView

像上面的截圖,我要2個按鈕,第一個是語音搜索,另一個是對條碼掃描儀,當搜索圖標點擊和Actionbar出現的SearchView。我可以通過搜索圖標實現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); 
     } 
    } 

截圖的,我從上面的代碼中得到了什麼:

Output of Above Code

任何幫助將高度讚賞。

回答

19

首先,你應該閱讀this

AndroidManifest.xml中與搜索查看小部件的活動(singleTop是必要的,請仔細閱讀上面的鏈接):

<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"/> 

中號odify 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); 
    } 
} 

這些變化後,你會在搜索查看看到一個麥克風按鈕。

+0

我想在當前活動的效果,不想打開新的意圖。有沒有可能性? –

+0

爲什麼不呢?您可以使用捆綁包保存活動狀態。 「 – moonsweel

+0

」在這些更改之後,您將在搜索視圖中看到一個麥克風按鈕。「只有設備支持它。 – aycanadal

0

請在你的代碼檢查,如果你沒有撥打:

searchView.setIconifiedByDefault(true) 

通過消除它,你應該看到的「聲音」圖標。

-1

只是把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>