Android ActionBar Настроить вид поиска

--- РЕШЕНА ПРОБЛЕМА - ДОБАВЛЕНЫ ОТВЕТЫ В РЕДАКТИРОВАНИЕ ТЕКСТА ---

Я использую ActionBar Sherlock в своем приложении для Android. Там я хочу показать 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. При открытии этого представления поиска оно появляется в левой части панели действий. Но мне нужно с правой стороны. Значок (лупа) на самом деле находится с правой стороны панели, но при нажатии на него открывается поле EditText с левой стороны. Я пытался использовать LayoutParams, но мне не хватает чего-то важного при попытке добавить его на панель действий с помощью LayoutParams.

введите здесь описание изображения

Так что, надеюсь, кто-то может помочь мне с этим.

Большое спасибо, Тобиас

---- ИЗМЕНИТЬ ----

Ладно, с этим уже решена одна вещь. Добавление ActionBar с помощью XML делает 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);

И в моем меню.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 ---

Просто чтобы вы знали. Я нашел решение для цвета текста. Это может быть достигнуто с помощью AutoCompleteTextView SearchView:

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 больше не закрывается при отправке текста. Так что коллапсActionView() и т. д. не работает. Есть идеи?

--- ИЗМЕНИТЬ 3 ---

Хорошо, я нашел решение. Я не знаю, правильный ли это способ сделать это, но при использовании

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

он закрывает EditText

Я должен сделать это дважды, потому что первый раз только «удаляет» мой входной текст и показывает «подсказку», тогда как второе использование «закрывает» Hint EditText и сворачивает searchView в лупу. Неуклюжий стиль, но он работает. :-)


person Tobias Reich    schedule 03.01.2013    source источник
comment
пожалуйста, посмотрите на этот вопрос. stackoverflow.com/questions/13560438/   -  person itsrajesh4uguys    schedule 03.01.2013
comment
Ну, если я правильно понимаю, они решают это, используя собственный EditText. Я надеялся на простой способ setTextColor, но это не кажется таким простым.   -  person Tobias Reich    schedule 03.01.2013
comment
Хорошо, я решил проблему с цветом. Но есть еще закрытие SearchView, которое не работает. В любом случае спасибо за вашу помощь!   -  person Tobias Reich    schedule 03.01.2013
comment
попробуйте отключить фокус из представления (если вы используете текст редактирования)   -  person itsrajesh4uguys    schedule 03.01.2013
comment
Как ни странно, я решил это, используя ((SearchView) searchMenuItem.getActionView()).setIconified(true); Но я должен использовать его дважды, так как первый закрывает мой собственный текст (и показывает подсказку), а второй затем закрывает подсказку и показывает лупу. Странно, но так работает... Если у кого-то есть лучшее решение, дайте мне знать, а пока я доволен! :-)   -  person Tobias Reich    schedule 03.01.2013
comment
Как насчет настройки значка рядом с текстом queryHint? он серый, как сделать его белым например?   -  person AndrewS    schedule 13.12.2013


Ответы (4)


Я сделал класс SearchViewFormatter, чтобы легко отформатировать собственный виджет Android SearchView. Пример:

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);
person ademar111190    schedule 04.06.2014
comment
почти работает... продублировал значок внутреннего поиска, когда попробовал. Я добавил комментарий с фиксированным кодом в вашей сути. - person kenyee; 06.06.2014
comment
Этот суть перенесен для поддержки appcompat. Спасибо ademar111190 за родную версию. - person neworld; 26.08.2014
comment
@datayeah см. суть @neworld двумя комментариями выше :) - person ademar111190; 01.10.2014
comment
извини @ ademar111190, у меня должен быть rtfc ;) - person dy_; 01.10.2014
comment
Этот класс отлично работал для моих целей и отлично работал на всех устройствах, на которых я его тестировал (множество уровней API от 15 до 19). Огромное спасибо! - person Charles Madere; 02.10.2014

К вашему сведению, теперь с поддержкой 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);
}
person prcaen    schedule 02.08.2013
comment
именно то, что я искал: findViewById(android.support.v7.appcompat.R.id.search_src_text) - person rymo; 04.12.2014

Я сделал закругленный угол для редактирования текста следующим образом.

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>

Перед нажатием кнопки поиска

После нажатия кнопки поиска

<SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:queryHint="Serach"
                android:layout_height="match_parent"></SearchView>
person Naveen Kumar M    schedule 09.06.2016

Чтобы решить ваш вопрос номер 2

Измените эту строку:

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

To:

.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

использовать только параметр SHOW_AS_ACTION_IF_ROOM в методе setShowAsAction()

person alfred abalos    schedule 03.04.2014