2013-01-03 4 views
42

--- risolto i problemi - ha aggiunto il RISPOSTE IN MODIFICA TESTO ---ActionBar Android Personalizza la ricerca Visualizza

sto usando il ActionBar Sherlock nella mia app Android. Lì voglio mostrare un SearchView. Funziona bene finora, ma mi rendo conto che sto facendo qualcosa di sbagliato quando cerco di personalizzarlo.

ho creare in questo modo:

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); 

voglio fare due cose:

  1. Modificare il colore del testo "Cerca", che viene visualizzato nel campo di testo che appare. Sembra che l'ho modificato con lo stile di testo generale nel mio tema, ma spero di poter impostare un colore separato in qualche modo.

  2. Quando si apre questa vista di ricerca, appare sul lato sinistro della barra delle azioni. Ma ho bisogno sul lato destro. L'icona (la lente di ingrandimento) si trova in realtà sul lato destro della barra, ma premendo si apre EditTextfield sul lato sinistro. Ho provato ad usare LayoutParams ma mi manca qualcosa di essenziale quando provo ad aggiungerlo alla barra delle azioni usando LayoutParams.

enter image description here

Quindi spero che qualcuno mi possa aiutare in questo.

La ringrazio molto, Tobias

---- ---- EDIT

Okay, una cosa è risolto con questo già. Aggiungendo ActionBar tramite XML, TextEdit si trova a destra.

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); 

E nella mia 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" /> 

Così almeno un mistero risolto (perché mai questo ha fatto la differenza). Ma l'XML appena creato non si chiude più quando si chiama

searchMenuItem.collapseActionView(); 

Quindi c'è ancora qualcosa di sbagliato in esso.

--- --- EDIT 2

Giusto per farvi sapere. Ho trovato la soluzione per il colore del testo. Esso può essere ottenuto utilizzando l'AutoCompleteTextView del 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));  

Quindi l'ultimo problema che ho è che il SearchView non chiude più al momento della presentazione di un testo. Quindi collapseActionView() ecc. Non funziona. Qualche idea?

--- --- EDIT 3

Va bene, ho trovato una soluzione.Non so se questo è il modo corretto di farlo, ma quando si utilizza

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

chiude il mio testo di input EditText

devo farlo due volte perché la prima volta è solo "l'eliminazione" e mostra il "suggerimento" mentre il secondo uso "chiude" il suggerimento EditText e collassa il searchView all'amplificatore. Stile maldestro ma funziona. :-)

+0

prega di dare un'occhiata a questa domanda. http://stackoverflow.com/questions/13560438/android-actionbar-sherlock-search-filter – itsrajesh4uguys

+0

Bene, se ho capito bene, lo stanno risolvendo usando un proprio EditText. Speravo in un modo semplice "setTextColor", ma non sembra essere così facile. –

+0

Ok, ho risolto il problema del colore. Ma c'è ancora la chiusura del SearchView che non funziona. Grazie comunque per il tuo aiuto! –

risposta

14

FYI ora con il supporto ActionBar v7 appcompat la strada per il colore della query cambiare suggerimento, colore del testo, la dimensione del testo:

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); 
} 
+3

esattamente quello che stavo cercando: 'findViewById (android.support.v7.appcompat.R.id.search_src_text)' – rymo

0

Per risolvere la tua domanda numero 2

modificare questa riga:

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

A:

.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 

utilizzare solo parametro SHOW_AS_ACTION_IF_ROOM su setShowAsAction() metodo

27

ho fatto una classe SearchViewFormatter per formattare facilmente il widget SearchView nativo Android. Un esempio:

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

quasi funziona ... duplicato l'icona di ricerca interna quando l'ho provato. Ho aggiunto un commento w/il codice fisso nel tuo succo. – kenyee

+0

Grazie @kenyee Ho aggiornato l'essenza con il vostro contributo: D – ademar111190

+7

Portato questo [gist per supportare appcompat] (https://gist.github.com/neworld/62b4bcb19c1985188f63). Grazie ademar111190 per la versione nativa. – neworld

2

angolo ho arrotondato per Edit testo come questo.

int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null); 
     View searchPlate = 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>