Android ActionBar自定义搜索视图

时间:2013-01-03 10:36:29

标签: android customization actionbarsherlock searchview

---解决了问题 - 在编辑文本中添加了答案---

我在Android应用中使用ActionBar Sherlock。在那里,我想展示一个SearchView。 它到目前为止工作正常,但我意识到,在尝试自定义时我做错了。

我这样创造:

searchView.setQueryHint("Search: ");
searchView.setOnQueryTextListener(this);
searchView.setOnCloseListener(...);

searchMenuItem = menu.add("Search place");
searchMenuItem.setIcon(R.drawable.ic_action_search)
              .setActionView(searchView)
              .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |  MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

我想做两件事:

  1. 更改出现的文本字段中显示的文本“搜索”的颜色。看起来我用我的主题中的整体文字样式改变了它,但我希望我能以某种方式设置单独的颜色。

  2. 打开此搜索视图时,它会显示在操作栏的左侧。但我需要在右侧。图标(放大镜)实际上位于条形图的右侧,但按下它会打开左侧的EditTextfield。我尝试使用LayoutParams但是在尝试使用LayoutParams将其添加到Action Bar时,我遗漏了一些必要的东西。

  3. enter image description here

    所以希望有人可以帮助我。

    非常感谢,  托拜厄斯

    ----编辑----

    好的,所以有一件事已经解决了。通过XML添加ActionBar使TextEdit向右。

    getSupportMenuInflater().inflate(R.menu.activity_main, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) searchItem.getActionView();
    Log.e(TAG, "searchView: " + searchView);
    

    在我的menu.xml中

    <item android:id="@+id/action_search"
     android:title="Search"
     android:icon="@drawable/ic_action_search"          
     android:showAsAction="always"
     android:actionViewClass="com.actionbarsherlock.widget.SearchView" />
    

    所以至少有一个谜团解决了(为什么这会产生影响)。但是新创建的XML在调用

    时不再关闭
    searchMenuItem.collapseActionView();
    

    所以它仍然有问题。

    ---编辑2 ---

    只是为了让你知道。我找到了文字颜色的解决方案。它可以通过使用SearchView的AutoCompleteTextView来实现:

    AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
    searchText.setHintTextColor(getResources().getColor(R.color.white));
    searchText.setTextColor(getResources().getColor(R.color.white));    
    

    所以我遇到的最后一个问题是SearchView在提交文本时不再关闭。所以collapseActionView()等不起作用。有什么想法吗?

    ---编辑3 ---

    好的,我找到了解决方案。我不知道这是否是正确的方法,但在使用时

    ((SearchView) searchMenuItem.getActionView()).setIconified(true);
    

    关闭EditText

    我必须做两次,因为第一次只是“删除”我的输入文本并显示“提示”,而第二次使用是“关闭”提示EditText并将searchView折叠到放大镜。 笨拙的风格,但它的工作原理。 : - )

4 个答案:

答案 0 :(得分:29)

我做了一个类SearchViewFormatter来轻松格式化本机SearchView android小部件。一个例子:

new SearchViewFormatter()
            .setSearchBackGroundResource(R.drawable.my_bg)
            .setSearchIconResource(R.drawable.my_ic, true, false) //true to icon inside edittext, false to outside
            .setSearchVoiceIconResource(R.drawable.my_ic)
            .setSearchTextColorResource(R.color.my_color)
            .setSearchHintColorResource(R.color.my_color)
            .setSearchCloseIconResource(R.drawable.my_ic)
            .setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)
            .format(mSearchView);

答案 1 :(得分:15)

仅供参考,现在使用ActionBar支持v7 appcompat更改查询提示颜色,文本颜色,文字大小的方式:

import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.SearchAutoComplete;

...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_home, menu);
    MenuItem searchItem = menu.findItem(R.id.item_search);
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    mSearchView.setOnQueryTextListener(this);
    mSearchView.setQueryHint(getString(R.string.text));
    SearchAutoComplete searchAutoComplete = (SearchAutoComplete) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchAutoComplete.setHintTextColor(mRes.getColor(android.R.color.white));
    searchAutoComplete.setTextSize(14);

    return super.onCreateOptionsMenu(menu);
}

答案 2 :(得分:4)

我为这样的编辑文本做了圆角。

int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
        View searchPlate = searchView.findViewById(searchPlateId);
        searchPlate.setBackgroundResource(R.drawable.bg_white_rounded);

        int searchSrcTextId = getResources().getIdentifier("android:id/search_src_text", null, null);
        EditText searchEditText = (EditText) searchView.findViewById(searchSrcTextId);
        searchEditText.setTextColor(Color.BLACK);
        searchEditText.setHintTextColor(Color.LTGRAY);

        int closeButtonId = searchView.getContext().getResources().getIdentifier("android:id/search_close_btn", null, null);
        ImageView closeButtonImage = (ImageView) searchView.findViewById(closeButtonId);
        closeButtonImage.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorPrimary), PorterDuff.Mode.SRC_IN);

<强> bg_white_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff"/>
    <corners android:radius="8dp"/>
</shape>

Before click search button

After click search button

<SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:queryHint="Serach"
                android:layout_height="match_parent"></SearchView>

答案 3 :(得分:1)

解决您的2号问题

更改此行:

.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |  MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

要:

.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

仅在SHOW_AS_ACTION_IF_ROOM方法

上使用setShowAsAction()参数