今回SearchViewを使用して検索ボックスを実装することにしたんだけど、いざアイコンやEditTextの入力時の色を変更しようとした時に色々試したので紹介する。
試したこと
- SearchViewにViewを取得できるメソッド or 変更を加えるメソッドがないかどうか
- そんなもんなかった
- Themeを上書きしてSearchViewのとこ書き換えられないかどうか
- アクセスできるプロパティじゃなかった悲しい
最終的にやったこと
結局色々検索した結果、SearchViewを拡張して直接Viewを取ってこれるようにする方法にした
実装
SearchView.java
public class SearchView extends android.widget.SearchView {
private ImageView searchButton;
private AutoCompleteTextView queryText;
private ImageView closeButton;
private ImageView searchGoButton;
private ImageView voiceButton;
private ImageView searchHintIcon;
public SearchView(Context context) {
super(context);
init();
}
public SearchView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
searchButton = (ImageView) findViewById(getIdentifier("android:id/search_button"));
queryText = (AutoCompleteTextView) findViewById(getIdentifier("android:id/search_src_text"));
closeButton = (ImageView) findViewById(getIdentifier("android:id/search_close_btn"));
searchGoButton = (ImageView) findViewById(getIdentifier("android:id/search_go_btn"));
voiceButton = (ImageView) findViewById(getIdentifier("android:id/voiceButton"));
searchHintIcon = (ImageView) findViewById(getIdentifier("android:id/search_mag_icon"));
}
private int getIdentifier(String resourceId) {
return getContext().getResources().getIdentifier(resourceId, null, null);
}
public ImageView getSearchButton() {
return searchButton;
}
public AutoCompleteTextView getQueryText() {
return queryText;
}
public ImageView getCloseButton() {
return closeButton;
}
public ImageView getSearchGoButton() {
return searchGoButton;
}
public ImageView getVoiceButton() {
return voiceButton;
}
public ImageView getSearchHintIcon() {
return searchHintIcon;
}
}
んでもってこんな感じにセットする
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SearchView search = (SearchView) findViewById(R.id.main_search);
search.getQueryText().setTextColor(getResources().getColor(android.R.color.holo_orange_dark));
search.getCloseButton().setImageResource(android.R.drawable.ic_delete);
search.getSearchHintIcon().setImageResource(android.R.drawable.ic_menu_camera);
}
}
結果はこんな感じ
これに加えてXML経由からTextSizeをセットできるようにしたけど今回は割愛。
SearchViewクラスのprivate AutoCompleteTextView queryText
の行の型はSearchAutoCompleteなんだけど、アクセスできない型だったのでEditTextにした。