Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在片段中使用扩展SearchView_Android - Fatal编程技术网

Android 如何在片段中使用扩展SearchView

Android 如何在片段中使用扩展SearchView,android,Android,我想扩展SearchView类以覆盖onKeyDown()方法。因此,我在我的fragment类中执行以下操作: public class myfragment extends ListFragment{ ... class CustomSearchView extends SearchView{ public CustomSearchView(Context context) { super(context); } public Cust

我想扩展SearchView类以覆盖onKeyDown()方法。因此,我在我的fragment类中执行以下操作:

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

出现此问题的原因是

中提到的解决方案,您可以将其转换为自定义的
搜索视图

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

支持库:

<?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”抛出类not found异常。我不确定我在这里做错了什么。我使用的是“android:showAsAction”,而不是“yourapp:showAsAction”。与“android:actionViewClass”相同。因为如果我使用“yourapp:…”,编辑器会显示错误“在包'com.example.xxx'中找不到属性'showAsAction'的资源标识符”。您可能是对的,因为我使用的是支持库,但我认为您没有。使用android名称空间。至于错误,您的类是公共的吗。也许你可以把它放在fragment类之外?你是对的!我没有使用支持库,所以我使用
android
名称空间。将
CustomSearchView
类放在它自己的java文件中解决了这个错误。但是当我触摸软键盘上的
SearchView
或任何字符时,根本不会触发
onKeyDown
。在fragment类中的搜索视图上定义的
onquerytextlistener
,确实会按预期触发。但是我不明白为什么没有调用
onKeyDown
。在
onKeyDown
中使用的
ActivityContext
是什么?覆盖dispatchKeyEventPreIme()而不是onKeyDown()是有效的,尽管由于某种原因每次调用两次。