【问题标题】:how to use an extend SearchView in fragment如何在片段中使用扩展 SearchView
【发布时间】:2013-12-17 19:37:49
【问题描述】:

我想扩展 SearchView 类以覆盖 onKeyDown() 方法。所以我在我的片段类中这样做如下:

public class myfragment extends ListFragment{
...
class CustomSearchView extends SearchView{
    public CustomSearchView(Context context) {
        super(context);
    }       

    public CustomSearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event){
        Toast.makeText(getActivity(), "onkeydown", Toast.LENGTH_SHORT).show();
        return super.onKeyDown(keyCode, event);
    }
}
...
}

现在我想在片段中使用这个扩展的 SearchView。但我不知道该怎么做。由于我使用 searchItem.getActionView() 创建了 SearchView 对象,有什么方法可以将其转换为 CustomSearchView 对象,以便在我的片段中触发覆盖的 onKeyDown 方法?

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    ...

            // Retrieves the system search manager service
            final SearchManager searchManager =
                    (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);

            // Retrieves the SearchView from the search menu item
            final SearchView searchView = (SearchView) searchItem.getActionView();

            // Assign searchable info to SearchView
            searchView.setSearchableInfo(
                    searchManager.getSearchableInfo(getActivity().getComponentName()));

            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String queryText) {
                    // Nothing needs to happen when the user submits the search string
                    return true;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    ...
                }
            });

这个问题是因为How can I get onBackPressed() while SearchView is activated?提到的解决方案弹出来的

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以投射到您的自定义SearchView

    final CustomSearchView searchView = (CustomSearchView) searchItem.getActionView();
    

    当您声明SearchView 时,您必须在meny xml 文件中使用完整的类名声明您自己的SearchView。此外,如果您使用支持库,则必须声明 http://schemas.android.com/apk/res-auto 命名空间:

    没有支持库:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <item android:id="@+id/action_search"
          android:title="@string/action_search"
          android:icon="@drawable/action_search"
          android:showAsAction="always|collapseActionView"
          android:actionViewClass="com.xxx.ListFragment.CustomSearchView" />
    

    支持库:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    
    <item android:id="@+id/action_search"
          android:title="@string/action_search"
          android:icon="@drawable/action_search"
          yourapp:showAsAction="always|collapseActionView"
          yourapp:actionViewClass="com.xxx.ListFragment.CustomSearchView" />
    

    【讨论】:

    • 菜单充气程序在运行时为“com.example.xxx.PhoneContactListFragment.CustomSearchView”类抛出一个找不到类的异常。我不确定我在这里做错了什么。我使用“android:showAsAction”,而不是“yourapp:showAsAction”。与“android:actionViewClass”相同。因为如果我使用“yourapp:..”,编辑器会显示错误“No resource identifier found for attribute 'showAsAction' in package 'com.example.xxx'”
    • 你可能是对的,因为我使用了支持库,但我认为你没有。使用 android 命名空间。至于错误,是你的班级公开的。也许你可以把它放在片段类之外?
    • 你是对的!我没有使用支持库,所以我使用 android 命名空间。将 CustomSearchView 类放入它自己的 java 文件中解决了该错误。但是当我触摸SearchView 或软键盘上的任何字符时,onKeyDown 根本不会被触发。在片段类的搜索视图中定义的onQueryTextLListener 确实按预期触发。但不明白为什么onKeyDown 根本没有被调用。
    • 您在onKeyDown 中使用的ActivityContext 是什么?
    • 覆盖 dispatchKeyEventPreIme() 而不是 onKeyDown() 有效,尽管由于某种原因它每次都会被调用两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多