簡體   English   中英

SearchView中的ActionBar Mic按鈕(語音搜索)

[英]ActionBar Mic Button(Voice Search) in SearchView

我正在實施Action Bar 我想要Action Bar SearchView搜索字段區域中的2個按鈕,如Flipkart應用程序。

Flipkart應用程序在SearchView中有兩個按鈕

像上面的截圖一樣,我想要2個按鈕,第一個用於語音搜索,另一個用於條形碼掃描,當點擊搜索圖標並出現SearchView of 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);
        }
    }

我從上面的代碼得到的截圖:

上述代碼的輸出

任何幫助將受到高度贊賞。

首先,你應該讀這個

使用searchview小部件進行活動的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"/>

修改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"放入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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM