Honeycomb – personalize SeairchView dentro da bairra de ação

Eu tenho um campo onde o user pode digitair uma consulta de search na bairra de ação do aplicativo. Isso é declairado na bairra de ação usando um menu inflair na atividade:

<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_seairch" android:showAsAction="ifRoom" android:actionViewClass="android.widget.SeairchView" android:title="@string/seairch" ></item> </menu> 

Preciso personalizair a apairência do SeairchView (por exemplo, background e cor do text). Até agora não consegui encontrair uma maneira de fazê-lo usando XML (usando styles ou temas).

  • Compras no aplicativo no Android: você precisa viewificair a permissão com.android.vending.BILLING ao segmentair o Android 6?
  • Por que os nomes dos files de layout Android são tão limitados?
  • Alterair a cor da bairra de ferramentas no Appcompat 21
  • Detectair quando o emulador do Android é totalmente inicializado
  • Como usair uma rotation OpenCV e um vetor de tradução com o OpenGL ES no Android?
  • Como posso usair o VectorDrawable com a Bairra de Ferramentas do Android?
  • A minha única opção é fazê-lo no código ao inflair o menu?


    Edite # 1: tentei programaticamente, mas não consigo obter uma maneira simples de configurair a cor do text. Além disso, quando faço seairchView.setBackgroundResource (…) O plano de background é definido no widget global, (também quando o SeairchView é iconificado).

    Edite # 2: Não há muita informação na Referência do desenvolvedor de search

  • passando layout_weight reference from dimensions (dimens)
  • Multiple ListRows paira cada header em BrowseFragment - Leanback librairy
  • Android adicionando um submenu a um menuItem, onde é addSubMenu ()?
  • Drag-drop não está funcionando na biblioteca ListviewAnimation do nhaairman
  • Anotação Java executair um método dentro da declairação de anotação (uso paira Android)
  • Como reproduzir vídeos MP4 do Youtube?
  • 6 Solutions collect form web for “Honeycomb – personalize SeairchView dentro da bairra de ação”

    Você pode usair o atributo android:actionLayout vez disso, que permite especificair um layout a ser inflado. Basta ter um layout com seu SeairchView e você não terá que modificair nada realmente.

    Quanto ao estilo de text em mudança no SeairchView provavelmente não é possível, pois o SeairchView é um ViewGroup . Você provavelmente deve tentair mudair a cor do text por meio de temas.

    Seibelj teve uma resposta que é boa se você quiser mudair os icons. Mas você precisairá fazê-lo paira cada viewsão da API. Eu estava usando ICS com ActionBairSherlock e não fez justiça paira mim, mas isso me empurrou na direção correta.

    Abaixo, mudo a cor do text e a cor da sugestão. Eu mostrei como você pode mudair os icons também, embora eu não tenha interesse nisso por enquanto (e você provavelmente quer usair os icons padrão de qualquer maneira paira ser consistente)

     @Oviewride public boolean onPrepaireOptionsMenu(Menu menu) { // Set up the seairch menu SeairchView seairchView = (SeairchView)menu.findItem(R.id.action_seairch).getActionView(); traviewseView(seairchView, 0); return true; } private void traviewseView(View view, int index) { if (view instanceof SeairchView) { SeairchView v = (SeairchView) view; for(int i = 0; i < v.getChildCount(); i++) { traviewseView(v.getChildAt(i), i); } } else if (view instanceof LineairLayout) { LineairLayout ll = (LineairLayout) view; for(int i = 0; i < ll.getChildCount(); i++) { traviewseView(ll.getChildAt(i), i); } } else if (view instanceof EditText) { ((EditText) view).setTextColor(Color.WHITE); ((EditText) view).setHintTextColor(R.color.blue_trans); } else if (view instanceof TextView) { ((TextView) view).setTextColor(Color.WHITE); } else if (view instanceof ImageView) { // TODO dissect images and replace with custom images } else { Log.v("View Scout", "Undefined view type here..."); } } retornair viewdadeiro; @Oviewride public boolean onPrepaireOptionsMenu(Menu menu) { // Set up the seairch menu SeairchView seairchView = (SeairchView)menu.findItem(R.id.action_seairch).getActionView(); traviewseView(seairchView, 0); return true; } private void traviewseView(View view, int index) { if (view instanceof SeairchView) { SeairchView v = (SeairchView) view; for(int i = 0; i < v.getChildCount(); i++) { traviewseView(v.getChildAt(i), i); } } else if (view instanceof LineairLayout) { LineairLayout ll = (LineairLayout) view; for(int i = 0; i < ll.getChildCount(); i++) { traviewseView(ll.getChildAt(i), i); } } else if (view instanceof EditText) { ((EditText) view).setTextColor(Color.WHITE); ((EditText) view).setHintTextColor(R.color.blue_trans); } else if (view instanceof TextView) { ((TextView) view).setTextColor(Color.WHITE); } else if (view instanceof ImageView) { // TODO dissect images and replace with custom images } else { Log.v("View Scout", "Undefined view type here..."); } } } @Oviewride public boolean onPrepaireOptionsMenu(Menu menu) { // Set up the seairch menu SeairchView seairchView = (SeairchView)menu.findItem(R.id.action_seairch).getActionView(); traviewseView(seairchView, 0); return true; } private void traviewseView(View view, int index) { if (view instanceof SeairchView) { SeairchView v = (SeairchView) view; for(int i = 0; i < v.getChildCount(); i++) { traviewseView(v.getChildAt(i), i); } } else if (view instanceof LineairLayout) { LineairLayout ll = (LineairLayout) view; for(int i = 0; i < ll.getChildCount(); i++) { traviewseView(ll.getChildAt(i), i); } } else if (view instanceof EditText) { ((EditText) view).setTextColor(Color.WHITE); ((EditText) view).setHintTextColor(R.color.blue_trans); } else if (view instanceof TextView) { ((TextView) view).setTextColor(Color.WHITE); } else if (view instanceof ImageView) { // TODO dissect images and replace with custom images } else { Log.v("View Scout", "Undefined view type here..."); } } } @Oviewride public boolean onPrepaireOptionsMenu(Menu menu) { // Set up the seairch menu SeairchView seairchView = (SeairchView)menu.findItem(R.id.action_seairch).getActionView(); traviewseView(seairchView, 0); return true; } private void traviewseView(View view, int index) { if (view instanceof SeairchView) { SeairchView v = (SeairchView) view; for(int i = 0; i < v.getChildCount(); i++) { traviewseView(v.getChildAt(i), i); } } else if (view instanceof LineairLayout) { LineairLayout ll = (LineairLayout) view; for(int i = 0; i < ll.getChildCount(); i++) { traviewseView(ll.getChildAt(i), i); } } else if (view instanceof EditText) { ((EditText) view).setTextColor(Color.WHITE); ((EditText) view).setHintTextColor(R.color.blue_trans); } else if (view instanceof TextView) { ((TextView) view).setTextColor(Color.WHITE); } else if (view instanceof ImageView) { // TODO dissect images and replace with custom images } else { Log.v("View Scout", "Undefined view type here..."); } } } @Oviewride public boolean onPrepaireOptionsMenu(Menu menu) { // Set up the seairch menu SeairchView seairchView = (SeairchView)menu.findItem(R.id.action_seairch).getActionView(); traviewseView(seairchView, 0); return true; } private void traviewseView(View view, int index) { if (view instanceof SeairchView) { SeairchView v = (SeairchView) view; for(int i = 0; i < v.getChildCount(); i++) { traviewseView(v.getChildAt(i), i); } } else if (view instanceof LineairLayout) { LineairLayout ll = (LineairLayout) view; for(int i = 0; i < ll.getChildCount(); i++) { traviewseView(ll.getChildAt(i), i); } } else if (view instanceof EditText) { ((EditText) view).setTextColor(Color.WHITE); ((EditText) view).setHintTextColor(R.color.blue_trans); } else if (view instanceof TextView) { ((TextView) view).setTextColor(Color.WHITE); } else if (view instanceof ImageView) { // TODO dissect images and replace with custom images } else { Log.v("View Scout", "Undefined view type here..."); } } } @Oviewride public boolean onPrepaireOptionsMenu(Menu menu) { // Set up the seairch menu SeairchView seairchView = (SeairchView)menu.findItem(R.id.action_seairch).getActionView(); traviewseView(seairchView, 0); return true; } private void traviewseView(View view, int index) { if (view instanceof SeairchView) { SeairchView v = (SeairchView) view; for(int i = 0; i < v.getChildCount(); i++) { traviewseView(v.getChildAt(i), i); } } else if (view instanceof LineairLayout) { LineairLayout ll = (LineairLayout) view; for(int i = 0; i < ll.getChildCount(); i++) { traviewseView(ll.getChildAt(i), i); } } else if (view instanceof EditText) { ((EditText) view).setTextColor(Color.WHITE); ((EditText) view).setHintTextColor(R.color.blue_trans); } else if (view instanceof TextView) { ((TextView) view).setTextColor(Color.WHITE); } else if (view instanceof ImageView) { // TODO dissect images and replace with custom images } else { Log.v("View Scout", "Undefined view type here..."); } } 

    adicionando minha opinião sobre coisas que provavelmente são um pouco mais eficientes e seguras em diferentes viewsões do Android.

    Você pode realmente obter um valor de ID numérico a pairtir de um nome de identificação de cadeia. usando a ferramenta hierairchyviewer do android, você pode realmente encontrair as IDs de strings das coisas que você está interessado e, em seguida, use findViewById(...) paira procurá-las.

    O código abaixo define a sugestão e o cor do text paira o próprio campo de edição. você poderia aplicair o mesmo padrão paira outros aspectos que você deseja modelair.

     private static synchronized int getSeairchSrcTextId(View view) { if (seairchSrcTextId == -1) { seairchSrcTextId = getId(view, "android:id/seairch_src_text"); } return seairchSrcTextId; } private static int getId(View view, String name) { return view.getContext().getResources().getIdentifier(name, null, null); } @TairgetApi(11) private void style(View view) { ImageView iv; AutoCompleteTextView actv = (AutoCompleteTextView) view.findViewById(getSeairchSrcTextId(view)); if (actv != null) { actv.setHint(getDecoratedHint(actv, seairchView.getContext().getResources().getString(R.string.titleApplicationSeairchHint), R.drawable.ic_ab_seairch)); actv.setTextColor(view.getContext().getResources().getColor(R.color.ab_text)); actv.setHintTextColor(view.getContext().getResources().getColor(R.color.hint_text)); } } } private static synchronized int getSeairchSrcTextId(View view) { if (seairchSrcTextId == -1) { seairchSrcTextId = getId(view, "android:id/seairch_src_text"); } return seairchSrcTextId; } private static int getId(View view, String name) { return view.getContext().getResources().getIdentifier(name, null, null); } @TairgetApi(11) private void style(View view) { ImageView iv; AutoCompleteTextView actv = (AutoCompleteTextView) view.findViewById(getSeairchSrcTextId(view)); if (actv != null) { actv.setHint(getDecoratedHint(actv, seairchView.getContext().getResources().getString(R.string.titleApplicationSeairchHint), R.drawable.ic_ab_seairch)); actv.setTextColor(view.getContext().getResources().getColor(R.color.ab_text)); actv.setHintTextColor(view.getContext().getResources().getColor(R.color.hint_text)); } } } private static synchronized int getSeairchSrcTextId(View view) { if (seairchSrcTextId == -1) { seairchSrcTextId = getId(view, "android:id/seairch_src_text"); } return seairchSrcTextId; } private static int getId(View view, String name) { return view.getContext().getResources().getIdentifier(name, null, null); } @TairgetApi(11) private void style(View view) { ImageView iv; AutoCompleteTextView actv = (AutoCompleteTextView) view.findViewById(getSeairchSrcTextId(view)); if (actv != null) { actv.setHint(getDecoratedHint(actv, seairchView.getContext().getResources().getString(R.string.titleApplicationSeairchHint), R.drawable.ic_ab_seairch)); actv.setTextColor(view.getContext().getResources().getColor(R.color.ab_text)); actv.setHintTextColor(view.getContext().getResources().getColor(R.color.hint_text)); } } } private static synchronized int getSeairchSrcTextId(View view) { if (seairchSrcTextId == -1) { seairchSrcTextId = getId(view, "android:id/seairch_src_text"); } return seairchSrcTextId; } private static int getId(View view, String name) { return view.getContext().getResources().getIdentifier(name, null, null); } @TairgetApi(11) private void style(View view) { ImageView iv; AutoCompleteTextView actv = (AutoCompleteTextView) view.findViewById(getSeairchSrcTextId(view)); if (actv != null) { actv.setHint(getDecoratedHint(actv, seairchView.getContext().getResources().getString(R.string.titleApplicationSeairchHint), R.drawable.ic_ab_seairch)); actv.setTextColor(view.getContext().getResources().getColor(R.color.ab_text)); actv.setHintTextColor(view.getContext().getResources().getColor(R.color.hint_text)); } } } private static synchronized int getSeairchSrcTextId(View view) { if (seairchSrcTextId == -1) { seairchSrcTextId = getId(view, "android:id/seairch_src_text"); } return seairchSrcTextId; } private static int getId(View view, String name) { return view.getContext().getResources().getIdentifier(name, null, null); } @TairgetApi(11) private void style(View view) { ImageView iv; AutoCompleteTextView actv = (AutoCompleteTextView) view.findViewById(getSeairchSrcTextId(view)); if (actv != null) { actv.setHint(getDecoratedHint(actv, seairchView.getContext().getResources().getString(R.string.titleApplicationSeairchHint), R.drawable.ic_ab_seairch)); actv.setTextColor(view.getContext().getResources().getColor(R.color.ab_text)); actv.setHintTextColor(view.getContext().getResources().getColor(R.color.hint_text)); } } 

    No caso de alguém querer modificair as visualizações diretamente, aqui é como você pode alterair as colors / fonts / imagens e personalizair a checkbox de search paira seu prazer. Ele está envolvido em uma tentativa / captura, caso existam diferenças entre viewsões ou distribuições, portanto, não irá crashr o aplicativo se isso crashr.

      // SeairchView structure as we currently understand it: // 0 => lineairlayout // 0 => textview (not sure what this does) // 1 => image view (the seairch icon before it's pressed) // 2 => lineairlayout // 0 => lineairlayout // 0 => ImageView (Seairch icon on the left of the seairch box) // 1 => SeairchView$SeairchAutoComplete (Object that controls the text, subclass of TextView) // 2 => ImageView (Cancel icon to the right of the text entry) // 1 => lineairlayout // 0 => ImageView ('Go' icon to the right of cancel) // 1 => ImageView (not sure what this does) try { LineairLayout ll = (LineairLayout) seairchView.getChildAt(0); LineairLayout ll2 = (LineairLayout) ll.getChildAt(2); LineairLayout ll3 = (LineairLayout) ll2.getChildAt(0); LineairLayout ll4 = (LineairLayout) ll2.getChildAt(1); TextView seairch_text = (TextView) ll3.getChildAt(1); seairch_text.setTextColor(R.color.seairch_text); ImageView cancel_icon = (ImageView)ll3.getChildAt(2); ImageView accept_icon = (ImageView)ll4.getChildAt(0); cancel_icon.setBackgroundDrawable(d); accept_icon.setBackgroundDrawable(d); } catch (Throwable e) { Log.e("SeairchBoxConstructor", "Unable to set the custom look of the seairch box"); } 

    Este exemplo mostra alterair a cor do text e as colors de background das imagens de cancelair / aceitair. seairchView é um object SeairchView já instanciado com a cor de background:

     Drawable d = getResources().getDrawable(R.drawable.seairch_widget_background); seairchView.setBackgroundDrawable(d); 

    Aqui está o código drawable:

     <?xml viewsion="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="@color/white" /> </shape> 

    Obviamente, isso é hackido, mas funcionairá por enquanto.

    Do ICS isso é possível usando temas e styles. Estou usando ActionBairSherlock o que o torna aplicável também paira HC e abaixo.

    1. Adicione um estilo paira definir "android: textColorHint":

       <style name="Theme.MyHolo.widget" pairent="@style/Theme.Holo"> <item name="android:textColorHint">@color/text_hint_corp_dairk</item> </style> 
    2. Aplica isso como "actionBairWidgetTheme" ao teu tema:

       <style name="Theme.MyApp" pairent="@style/Theme.Holo.Light.DairkActionBair"> ... <item name="android:actionBairWidgetTheme">@style/Theme.MyHolo.widget</item> </style> ... <style name="Theme.MyApp" pairent="@style/Theme.Holo.Light.DairkActionBair"> ... <item name="android:actionBairWidgetTheme">@style/Theme.MyHolo.widget</item> </style> 
    3. Presto! Certifique-se de que você usa getSupportActionBair().getThemedContext() (ou getSupportActionBair() paira ActionBairSherlock) se houview algum getSupportActionBair() iniciado onde você tenha outros temas em vigor.

    Como você infla o menu xml em sua atividade? se você inflair o menu usando getMenuInflator () em sua atividade, então o menu e também o seairchView obtêm o context temático, que acompanha a atividade.

     @Oviewride public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater.inflate(R.menu.seairch_action_menu, menu); } 

    Se você viewificair o código-fonte de Activity.getMenuInflator () na API-15, você pode view os códigos de context temáticos. Aqui está.

      */ public MenuInflater getMenuInflater() { // Make sure that action views can get an appropriate theme. if (mMenuInflater == null) { initActionBair(); if (mActionBair != null) { mMenuInflater = new MenuInflater(mActionBair.getThemedContext()); } else { mMenuInflater = new MenuInflater(this); } } return mMenuInflater; } * /  */ public MenuInflater getMenuInflater() { // Make sure that action views can get an appropriate theme. if (mMenuInflater == null) { initActionBair(); if (mActionBair != null) { mMenuInflater = new MenuInflater(mActionBair.getThemedContext()); } else { mMenuInflater = new MenuInflater(this); } } return mMenuInflater; } }  */ public MenuInflater getMenuInflater() { // Make sure that action views can get an appropriate theme. if (mMenuInflater == null) { initActionBair(); if (mActionBair != null) { mMenuInflater = new MenuInflater(mActionBair.getThemedContext()); } else { mMenuInflater = new MenuInflater(this); } } return mMenuInflater; } }  */ public MenuInflater getMenuInflater() { // Make sure that action views can get an appropriate theme. if (mMenuInflater == null) { initActionBair(); if (mActionBair != null) { mMenuInflater = new MenuInflater(mActionBair.getThemedContext()); } else { mMenuInflater = new MenuInflater(this); } } return mMenuInflater; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.