【Android開発】AppCompatのSearchViewのテキストカラーやアイコンを変更する
AppCompatのSearchViewのアイコンやテキストカラーを変更しようと思い、style.xmlで変更出来るだろうと考えていたら、どうやらそう簡単にはいかないらしく、変更する方法を見つけるのに意外と手間がかかったので、メモとして書いておきます。
まず、SearchViewを追加したいmenuリソースに以下のようにメニューアイテムを追加します。
具体的には以下のようにします。
本当はstyle.xmlで一括で変更出来ると良いのですが、残念ながら自分ではstyle.xmlから変更する方法を見つけられなかったので、「style.xmlで変更する方法、知ってるよ!」という方が居れば、コメントなどで教えていただけると助かります。
このソースコードはgithubでも公開していますので、よろしければどうぞ。
今回の開発環境
- Mac OS X 10.9.4
- Android Studio Beta 0.8.6
前準備
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".MainActivity"> <item android:id="@+id/search_view" app:actionViewClass="android.support.v7.widget.SearchView" android:icon="@drawable/ic_action_search" android:showAsAction="always" android:title="Search" app:showAsAction="always" /> </menu>次に、Activityの onCreateOptionsMenu() で SearchView を取得しておきます。
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); SearchView searchView = (SearchView) MenuItemCompat.getActionView( menu.findItem(R.id.search_view) ); return true; }また、取得したSearchViewから SearchAutoComplete を取得しておきます。
@Override public boolean onCreateOptionsMenu(Menu menu) { /* 省略 */ SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView .findViewById( android.support.v7.appcompat.R.id.search_src_text ); /* 省略 */ }これで準備完了です。
ActionBarのSearchViewのアイコンを変更する
ActionBarのSearchViewのアイコンを変更するには、SearchViewからアイコンを表示しているImageViewを取得し、画像を差し替えることで変更できます。具体的には以下のようにします。
ImageView searchIcon = (ImageView) searchView.findViewById( android.support.v7.appcompat.R.id.search_button ); searchIcon.setImageResource(R.drawable.ic_action_search);
SearchAutoComplete内のSearchViewアイコンを変更する
SearchViewのSearchAutoComplete内のアイコンを変更するには、以下のようにSpannableStringBuilderを使ってHintTextと一緒にアイコンを変更します。SpannableStringBuilder ssb = new SpannableStringBuilder(" "); // ヒントテキスト ssb.append("Enter the keyword"); // ヒントアイコン Drawable searchHintIcon = getResources().getDrawable(R.drawable.ic_action_search); int textSize = (int) (searchAutoComplete.getTextSize() * 1.25); searchHintIcon.setBounds(0, 0, textSize, textSize); ssb.setSpan( new ImageSpan(searchHintIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); searchAutoComplete.setHint(ssb);
SearchViewのテキストカラーを変更する
既にSearchViewからSearchAutoCompleteを取得しているので、これのsetTextColor()メソッドを使うことで、テキストカラーを変更することができます。searchAutoComplete.setTextColor(Color.rgb(0x56, 0x77, 0xfc));
SearchViewのヒントテキストのカラーを変更する
これも、SearchAutoCompleteのsetHintTextColor()メソッドを使うことで、テキストカラーを変更することができます。searchAutoComplete.setHintTextColor(Color.rgb(0x91, 0xa7, 0xff));
SearchViewのテキスト削除アイコンを変更する
SearchViewに文字を入力すると右側に出てくる削除アイコンを変更するには、ActionBarのアイコンと同様に、SearchViewからアイコンを表示しているImageViewを取得し、画像を差し替えることで変更することができます。ImageView removeIcon = (ImageView) searchView.findViewById( android.support.v7.appcompat.R.id.search_close_btn ); removeIcon.setImageResource(R.drawable.ic_action_remove);
コード全体
これらのコードをまとめると、コード全体はこのようになります。
res/menu/main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".MainActivity"> <item android:id="@+id/search_view" app:actionViewClass="android.support.v7.widget.SearchView" android:icon="@drawable/ic_action_search" android:showAsAction="always" android:title="Search" app:showAsAction="always" /> </menu>
MainActivity.java
import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.SearchView; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.ImageSpan; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageView; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); SearchView searchView = (SearchView) MenuItemCompat.getActionView( menu.findItem(R.id.search_view) ); SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView .findViewById( android.support.v7.appcompat.R.id.search_src_text ); // ActionBarの検索アイコン ImageView searchIcon = (ImageView) searchView.findViewById( android.support.v7.appcompat.R.id.search_button ); searchIcon.setImageResource(R.drawable.ic_action_search); SpannableStringBuilder ssb = new SpannableStringBuilder(" "); // ヒントテキスト ssb.append("Enter the keyword"); // ヒントアイコン Drawable searchHintIcon = getResources().getDrawable(R.drawable.ic_action_search); int textSize = (int) (searchAutoComplete.getTextSize() * 1.25); searchHintIcon.setBounds(0, 0, textSize, textSize); ssb.setSpan( new ImageSpan(searchHintIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); searchAutoComplete.setHint(ssb); // テキストカラー searchAutoComplete.setTextColor(Color.rgb(0x56, 0x77, 0xfc)); // ヒントテキストカラー searchAutoComplete.setHintTextColor( Color.rgb(0x91, 0xa7, 0xff) ); // Remove button icon ImageView removeIcon = (ImageView) searchView.findViewById( android.support.v7.appcompat.R.id.search_close_btn ); removeIcon.setImageResource(R.drawable.ic_action_remove); return true; } }
実行してみる
実際に実行してみると、このようにアイコンやテキストカラーが変更されていることが確認できます。まとめ
あまりスマートな方法ではないですが、なんとかテキストカラーやアイコンを自分の好きなものに変更することができました。本当はstyle.xmlで一括で変更出来ると良いのですが、残念ながら自分ではstyle.xmlから変更する方法を見つけられなかったので、「style.xmlで変更する方法、知ってるよ!」という方が居れば、コメントなどで教えていただけると助かります。
このソースコードはgithubでも公開していますので、よろしければどうぞ。
https://github.com/syarihu/SearchViewTestでは、お疲れ様でした。
参考記事
- Styling AppCompat SearchView
http://blog.luxteam.net/2013/11/04/styling-appcompat-searchview/
コメント
コメントを投稿