2014-01-26 9 views
5

Ich implementiere Action Bar. Ich möchte 2 Buttons im Suchfeld von Action Bar SearchView wie Flipkart App.ActionBar Mic-Taste (Sprachsuche) in SearchView

Flipkart app have two buttons in SearchView

Wie oben Screenshot, I 2 Tasten wollen, erste ist für Voice Search und die andere ist für Barcode-Scanner, wenn Suchsymbol und SearchView von Actionbar erscheint angeklickt. Ich bin in der Lage, actionbar serahcview mit Suchsymbol zu implementieren. Aber ich bin etwas verwirrt, warum die Sprachsuche nicht in meiner App erscheint. Schauen Sie sich meinen Quellcode an.

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); 
     } 
    } 

Screenshot Was ich von oben Code bekam:

Output of Above Code

Jede mögliche Hilfe würde sehr geschätzt werden.

Antwort

19

Zunächst sollten Sie this

AndroidManifest.xml für Ihre Aktivität mit Search Widget (singleTop notwendig ist, lesen Sie bitte den Link oben) lesen:

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

erstellen .../res/xml/searchable.xml mit diesem:

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

M odify onCreateOptionsMenu (letzten beiden Zeilen sind Materie)

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())); 
} 

Und außer Kraft setzen schließlich onNewIntent():

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

Nach diesen Änderungen finden Sie eine Mikrofontaste in einem Search sehen.

+0

ich auf aktuelle Aktivität bewirken wollen, Dont New Intent öffnen möchten. Gibt es eine Möglichkeit? –

+0

Warum nicht? Sie können einen Aktivitätsstatus mithilfe von Bundles speichern. – moonsweel

+0

"Nach diesen Änderungen sehen Sie in einer Suchansicht eine Mikrofontaste." Nur wenn das Gerät dies unterstützt. – aycanadal

0

Bitte überprüfen Sie in Ihrem Code, wenn Sie nicht angerufen hat:

searchView.setIconifiedByDefault(true) 

Durch das Entfernen Sie sollten die ‚Stimme‘ Symbol.

-1

einfach den android:launchMode="singleTop" in Ihrem Aktivitäts-Tag-Manifest

<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> 
Verwandte Themen