Android操作栏搜索视图是否自动完成?

Android操作栏搜索视图是否自动完成?,android,autocomplete,autocompletetextview,searchview,Android,Autocomplete,Autocompletetextview,Searchview,我正在操作栏中使用SearchView。我想在“搜索”视图上使用“自动完成”功能从数据库中获取结果 这可能吗?或者我需要使用自定义文本框,然后添加自动完成功能吗?是的,这是可能的。为您的建议构建一个表(例如在SQLiteDatabase中),并使用所需列格式化该表 我已经使用了自定义的AutoCompleteTextView并将其添加到ActionBar中。 public class MainActivity extends Activity { private static fina

我正在操作栏中使用SearchView。我想在“搜索”视图上使用“自动完成”功能从数据库中获取结果


这可能吗?或者我需要使用自定义文本框,然后添加自动完成功能吗?

是的,这是可能的。为您的建议构建一个表(例如在SQLiteDatabase中),并使用所需列格式化该表


我已经使用了自定义的AutoCompleteTextView并将其添加到ActionBar中。

public class MainActivity extends Activity {

    private static final String[] COUNTRIES = new String[] { "Belgium",
            "France", "France_", "Italy", "Germany", "Spain" };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowCustomEnabled(true);
        // actionBar.setDisplayShowTitleEnabled(false);
        // actionBar.setIcon(R.drawable.ic_action_search);

        LayoutInflater inflator = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.actionbar, null);

        actionBar.setCustomView(v);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line, COUNTRIES);
        AutoCompleteTextView textView = (AutoCompleteTextView) v
                .findViewById(R.id.editText1);
        textView.setAdapter(adapter);

    }

}

公共类MainActivity扩展活动{
私有静态最终字符串[]国家=新字符串[]{“比利时”,
“法国”、“法国”、“意大利”、“德国”、“西班牙”};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar ActionBar=getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowCustomEnabled(true);
//actionBar.setDisplayShowTitleEnabled(false);
//actionBar.setIcon(R.drawable.ic\u action\u search);
LayoutInflater充气机=(LayoutInflater)此
.getSystemService(上下文布局\充气机\服务);
视图v=充气机充气(R.layout.actionbar,空);
actionBar.setCustomView(v);
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_下拉列表_项目_1行,国家/地区);
AutoCompleteTextView文本视图=(AutoCompleteTextView)v
.findViewById(R.id.editText1);
setAdapter(适配器);
}
}
以及您的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Action Bar:"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="#FFFFFF" />

    <AutoCompleteTextView
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:imeOptions="actionSearch"
        android:inputType="textAutoComplete|textAutoCorrect"
        android:textColor="#FFFFFF" >

        <requestFocus />
    </AutoCompleteTextView>

</LinearLayout>


这可能会对您有所帮助。

您可以使用游标适配器通过以下方式完成此操作:

MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

searchView.setSuggestionsAdapter(adapter);

因此,我不得不对v7版本执行此操作,并沮丧地发现无法简单地使用ArrayAdapter设置适配器

我不想使用stock AutoCompleteTextView(正如这里的顶级评论员所做的那样),因为这样您就错过了SearchView的许多时髦功能,比如小搜索图标和x按钮

所以我扩展了SearchView并得到了以下结果:

public class ArrayAdapterSearchView extends SearchView {

private SearchView.SearchAutoComplete mSearchAutoComplete;

public ArrayAdapterSearchView(Context context) {
    super(context);
    initialize();
}

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

public void initialize() {
    mSearchAutoComplete = (SearchAutoComplete) findViewById(android.support.v7.appcompat.R.id.search_src_text);
    this.setAdapter(null);
    this.setOnItemClickListener(null);
}

@Override
public void setSuggestionsAdapter(CursorAdapter adapter) {
    // don't let anyone touch this
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mSearchAutoComplete.setOnItemClickListener(listener);
}

public void setAdapter(ArrayAdapter<?> adapter) {
    mSearchAutoComplete.setAdapter(adapter);
}

public void setText(String text) {
    mSearchAutoComplete.setText(text);
}

}
公共类ArrayAdapterSearchView扩展了SearchView{
private SearchView.SearchAutoComplete mSearchAutoComplete;
公共ArrayAdapterSearchView(上下文){
超级(上下文);
初始化();
}
公共ArrayAdapterSearchView(上下文上下文、属性集属性){
超级(上下文,attrs);
初始化();
}
公共无效初始化(){
msearchautomplete=(SearchAutoComplete)findViewById(android.support.v7.appcompat.R.id.search\u src\u text);
此.setAdapter(null);
this.setOnItemClickListener(null);
}
@凌驾
公用void SetSuggestionAdapter(游标适配器){
//不要让任何人碰这个
}
公共void setOnItemClickListener(OnItemClickListener侦听器){
mSearchAutoComplete.setOnItemClickListener(listener);
}
公用无效设置适配器(ArrayAdapter适配器){
msearchautomplete.setAdapter(适配器);
}
公共void setText(字符串文本){
msearchautomlete.setText(文本);
}
}
您可以在ActionBar的菜单xml中使用它,如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_add"
    android:title="TITLE"
    app:actionViewClass="com.yourpackage.ArrayAdapterSearchView"
    app:showAsAction="ifRoom|collapseActionView"/>

</menu>

您可能还希望将单击功能添加到自动完成列表中(例如,将文本设置为编辑文本):

MenuItem searchItem=menu.findItem(R.id.action\u search);
最终ArrayAdapterSearchView searchView=(ArrayAdapterSearchView)searchItem.getActionView();
searchView.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
searchView.setText(adapter.getItem(position.toString());
}
});
下面是一个类似的版本,用于常规的旧android.widget.SearchView:

public class ArrayAdapterSearchView extends SearchView {

private AutoCompleteTextView mSearchAutoComplete;

public ArrayAdapterSearchView(Context context) {
    super(context);
    initialize();
}

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

public void initialize() {
    mSearchAutoComplete = (AutoCompleteTextView) findViewById(getResources().getIdentifier("android:id/search_src_text", null, null));
    setAutoCompleSuggestionsAdapter(null);
    setOnItemClickListener(null);
}

@Override
public void setSuggestionsAdapter(CursorAdapter adapter) {
    throw new UnsupportedOperationException("Please use setAutoCompleSuggestionsAdapter(ArrayAdapter<?> adapter) instead");
}

public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
    mSearchAutoComplete.setOnItemClickListener(listener);
}

public void setAutoCompleSuggestionsAdapter(ArrayAdapter<?> adapter) {
    mSearchAutoComplete.setAdapter(adapter);
}

public void setText(String text) {
    mSearchAutoComplete.setText(text);
}

}
公共类ArrayAdapterSearchView扩展了SearchView{
私有自动完成文本视图msearchutocomplete;
公共ArrayAdapterSearchView(上下文){
超级(上下文);
初始化();
}
公共ArrayAdapterSearchView(上下文上下文、属性集属性){
超级(上下文,attrs);
初始化();
}
公共无效初始化(){
mSearchAutoComplete=(AutoCompleteTextView)findViewById(getResources().getIdentifier(“android:id/search\u src\u text”,null,null));
SetAutoCompleteSuggestionsAdapter(空);
setOnItemClickListener(空);
}
@凌驾
公用void SetSuggestionAdapter(游标适配器){
抛出新的UnsupportedOperationException(“请改用SetAutoCompleteSuggestionAdapter(ArrayAdapter适配器));
}
public void setOnItemClickListener(AdapterView.OnItemClickListener侦听器){
mSearchAutoComplete.setOnItemClickListener(listener);
}
public void setAutoCompleteSuggestionAdapter(ArrayAdapter适配器){
msearchautomplete.setAdapter(适配器);
}
公共void setText(字符串文本){
msearchautomlete.setText(文本);
}
}

这里有一个使用
游标适配器的替代方法:

ExampleActivity.java

现在,您需要创建一个从
CursorAdapter
扩展的适配器:

ExampleAdapter.java

现在,您可以通过向布局中添加其他文本或图像视图并使用适配器中的数据填充它们来自定义列表项。现在您需要一个SearchView菜单项:

res/menu/example.xml


然后创建一个可搜索的配置:

res/xml/searchable.xml


最后,将其添加到清单文件中的相关活动标记中:

AndroidManifest.xml



我也遇到了自动完成搜索视图的问题,并且在不使用任何额外布局和自动完成文本视图的情况下解决了这个问题,有一个类叫做SearchAutoComplete。我用它来实现自动完成功能,只需放置一个简单的列表适配器,其中包含一个项目的ArrayList,以便在搜索视图中进行建议。将适配器设置为您的搜索自动完成,自动完成功能将启动
public class ArrayAdapterSearchView extends SearchView {

private AutoCompleteTextView mSearchAutoComplete;

public ArrayAdapterSearchView(Context context) {
    super(context);
    initialize();
}

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

public void initialize() {
    mSearchAutoComplete = (AutoCompleteTextView) findViewById(getResources().getIdentifier("android:id/search_src_text", null, null));
    setAutoCompleSuggestionsAdapter(null);
    setOnItemClickListener(null);
}

@Override
public void setSuggestionsAdapter(CursorAdapter adapter) {
    throw new UnsupportedOperationException("Please use setAutoCompleSuggestionsAdapter(ArrayAdapter<?> adapter) instead");
}

public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {
    mSearchAutoComplete.setOnItemClickListener(listener);
}

public void setAutoCompleSuggestionsAdapter(ArrayAdapter<?> adapter) {
    mSearchAutoComplete.setAdapter(adapter);
}

public void setText(String text) {
    mSearchAutoComplete.setText(text);
}

}
private Menu menu;

@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.example, menu);

    this.menu = menu;

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

        SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();

        search.setSearchableInfo(manager.getSearchableInfo(getComponentName()));

        search.setOnQueryTextListener(new OnQueryTextListener() { 

            @Override 
            public boolean onQueryTextChange(String query) {

                loadHistory(query);

                return true; 

            } 

        });

    }

    return true;

}

// History
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void loadHistory(String query) {

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

        Cursor cursor = db.rawQuery("SELECT * FROM items", null); // Example database query

        SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        final SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();

        search.setSearchableInfo(manager.getSearchableInfo(getComponentName()));

        search.setSuggestionsAdapter(new ExampleAdapter(this, cursor, items));

    }

}
public class ExampleAdapter extends CursorAdapter {

    private List<String> items;

    private TextView text;

    public ExampleAdapter(Context context, Cursor cursor, List<String> items) {

        super(context, cursor, false);

        this.items = items;

    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        text.setText(cursor.getString(cursor.getColumnIndex("text"))); // Example column index

    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View view = inflater.inflate(R.layout.item, parent, false);

        text = (TextView) view.findViewById(R.id.text);

        return view;

    }

}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView
        android:id="@+id/item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/search"
        android:title="@string/search"
        android:showAsAction="ifRoom"
        android:actionViewClass="android.widget.SearchView" />

</menu>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search"
    android:hint="@string/search" >
</searchable>
<intent-filter>
    <action android:name="android.intent.action.SEARCH" />
</intent-filter>

<meta-data
    android:name="android.app.default_searchable"
    android:value="com.example.ExampleActivity" />
<meta-data
    android:name="android.app.searchable"
    android:resource="@xml/searchable" />
    @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);

MenuItem searchItem = menu.findItem(R.id.search);
SearchView mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);

SearchAutoComplete searchAutoComplete = (SearchAutoComplete)     mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, itemArrayList);
searchAutoComplete.setAdapter(adapter);

SearchManager searchManager =
(SearchManager) getSystemService(this.SEARCH_SERVICE);
mSearchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return true;
}
  searchAutoComplete.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
    long id) {
    // TODO Auto-generated method stub

    String searchString=(String)parent.getItemAtPosition(position);
    searchAutoComplete.setText(""+searchString);
    Toast.makeText(MainActivity.this, "you clicked "+searchString, Toast.LENGTH_LONG).show();

    }
    });
    SearchAutoComplete searchAutoComplete = mSearchView.findViewById(androidx.appcompat.R.id.search_src_text);