【问题标题】:ActionBar Mic Button(Voice Search) in SearchViewSearchView 中的 ActionBar 麦克风按钮(语音搜索)
【发布时间】:2014-01-26 23:27:38
【问题描述】:

我正在实施Action Bar。我想要Action Bar SearchView 的搜索字段区域中的 2 个按钮,例如 Flipkart 应用程序。

像上面的截图一样,我想要 2 个按钮,第一个用于语音搜索,另一个用于条码扫描器,当单击搜索图标并出现 ActionbarSearchView 时。我可以使用搜索图标实现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);
        }
    }

我从上面的代码中得到的截图:

任何帮助将不胜感激。

【问题讨论】:

    标签: android android-actionbar searchview


    【解决方案1】:

    首先,你应该阅读this

    您的活动的 AndroidManifest.xml 与 searchview 小部件(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);
        }
    }
    

    进行这些更改后,您将在搜索视图中看到一个麦克风按钮。

    【讨论】:

    • 我想影响当前的活动,不想打开新的意图。有没有可能。
    • 为什么不呢?您可以使用包保存活动状态。
    • "在这些更改之后,您将在搜索视图中看到一个麦克风按钮。"仅当设备支持时。
    • 如何在其他活动中显示语音图标?只出现mainactivity
    • @Webserveis 为该活动定义元数据,就像在我的示例中为 MainActivity 一样。
    【解决方案2】:

    只需将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>
    

    【讨论】:

      【解决方案3】:

      如果您没有致电,请检查您的代码:

       searchView.setIconifiedByDefault(true)
      

      删除它后,您应该会看到“语音”图标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        • 2014-11-23
        • 1970-01-01
        • 2021-07-15
        • 2017-10-26
        相关资源
        最近更新 更多