在Android中自定义搜索?

时间:2015-10-23 04:09:38

标签: android android-layout android-activity android-search

我一直致力于在Custom search App-bar中实施Android。所以,我在menu_main.xml

中添加了以下代码
<item android:id="@+id/action_search"
    android:title="search"
    android:icon="@drawable/ic_search"
    app:showAsAction="ifRoom|collapseActionView"
    android:hint="Enter Tags"
    app:actionViewClass="android.support.v7.widget.SearchView" />

现在我在看HomeActivity。它看起来像这样:

enter image description here

非常好!我没有实现上面SearchView的后端代码。现在,我想在上面Search bar

中添加以下一些功能
  • 用户可以使用标签进行搜索(使用标签搜索意味着如果两个单词之间有空格,那么我会将它们视为标签)。它与Pintreset app。

  • 非常相似
  • 此外,我想从Search Bar获取这些代码并将其放入Get请求参数。

    截图

enter image description here

问题

  • 目前,忘了Style。我只想知道如何在Search Bar中实现这一目标?
  • 如何在Android app bar
  • 中使用此十字标记在每个标记上添加框

任何帮助都会很明显。

修改-1

我正在添加onCreateOptionsMenu方法:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    if (null != searchView) {
        searchView.setSearchableInfo(searchManager
                .getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    }

    SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
        public boolean onQueryTextChange(String newText) {
            // this is your adapter that will be filtered
            return true;
        }

        public boolean onQueryTextSubmit(String query) {
            //Here u can get the value "query" which is entered in the search box.
            return  true;
        }
    };
    searchView.setOnQueryTextListener(queryTextListener);

    return super.onCreateOptionsMenu(menu);
}

我正在使用onCreateOptionsMenu.onQueryTextSubmit方法获取提交文本。我现在该怎么办?

1 个答案:

答案 0 :(得分:1)

您应该使用自定义搜索视图来访问工具栏中的EditText(菜单布局中的app:actionViewClass属性)。设置TextWathcer并管理afterTextChanged回调内的跨度。

我写了一些基本背景跨度实现的例子。这是解决问题的主要概念和起点。

见下面的例子:

<强> menu_main.xml:

<item android:id="@+id/action_search"
    android:title="search"
    android:icon="@drawable/ic_search"
    app:showAsAction="ifRoom|collapseActionView"
    android:hint="Enter Tags"
    app:actionViewClass="your.package.CustomSearchView" />

<强> CustomSearchView.java:

public class CustomSearchView extends SearchView {

    private AutoCompleteTextView mSearchAutoComplete;

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

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

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

    public void initialize() {
        mSearchAutoComplete = (AutoCompleteTextView) findViewById(android.support.v7.appcompat.R.id.search_src_text);

        if (mSearchAutoComplete == null) {
            Log.wtf("TEST", "Some Changes in AppCompat????");
            return;
        }
        mSearchAutoComplete.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                mSearchAutoComplete.removeTextChangedListener(this);
                setSpans(s, Color.RED);
                mSearchAutoComplete.addTextChangedListener(this);
            }
        });
    }

    private void setSpans(Editable s, @ColorInt int backgroundColor) {
        BackgroundColorSpan[] spans = s.getSpans(0, s.length(), BackgroundColorSpan.class);

        String[] words;
        if (s.toString().endsWith(" ")) {
            words = (s.toString() + "X").split("\\s");
        } else {
            words = s.toString().split("\\s");
        }
        int completedWordsCount = words.length - 1;
        if (spans.length != completedWordsCount) {
            for (BackgroundColorSpan span : spans) {
                s.removeSpan(span);
            }

            int currentIndex = 0;
            for (int i = 0; i < words.length - 1; i++) {
                s.setSpan(new BackgroundColorSpan(backgroundColor), currentIndex, currentIndex + words[i].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                currentIndex += words[i].length() + 1;
            }
        }
    }
}

P.S。此链接可能对您有用,以便设置可点击的跨度 - Link