У меня есть собственный Android SearchView в моем приложении. Я пытаюсь расширить его, добавив пользовательские значки камеры для функциональности ImageSearch.
Я попытался расширить его, используя onCreateActionMode его searchTextView, но значок не отображается. Я хочу, чтобы значок был добавлен в SearchView. Вот мой код:
public class CabSearchView extends SearchView {
private static final boolean DEFAULT_CAB_ENABLED = true;
private static final int IMAGESEARCH = 0;
private boolean mCabEnabled;
public CabSearchView(Context context) {
this(context, null);
}
public CabSearchView(Context context, AttributeSet attrs) {
this(context, attrs, android.support.v7.appcompat.R.attr.searchViewStyle);
}
public CabSearchView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
int themedIconColor = R.color.white;
SearchView.SearchAutoComplete searchSrcTextView = (SearchView.SearchAutoComplete)findViewById(R.id.search_src_text);
searchSrcTextView.setCustomSelectionActionModeCallback(new Callback());
searchSrcTextView.setTextColor(getResources().getColor(themedIconColor));
searchSrcTextView.setHintTextColor(getResources().getColor(themedIconColor));
ImageView searchMagIcon = (ImageView)findViewById(R.id.search_mag_icon);
searchMagIcon.setColorFilter(getResources().getColor(themedIconColor));
ImageView searchCloseBtn = (ImageView) findViewById(R.id.search_close_btn);
searchCloseBtn.setColorFilter(getResources().getColor(themedIconColor));
addFilter(searchSrcTextView, new PlainTextInputFilter());
initLayoutAttributes(attrs, defStyleAttr);
}
public boolean isCabEnabled() {
return mCabEnabled;
}
public void setCabEnabled(boolean enabled) {
mCabEnabled = enabled;
}
private void addFilter(TextView textView, InputFilter filter) {
InputFilter[] filters = textView.getFilters();
InputFilter[] newFilters = Arrays.copyOf(filters, filters.length + 1);
newFilters[filters.length] = filter;
textView.setFilters(newFilters);
}
private void initLayoutAttributes(AttributeSet attrs, int defStyleAttr) {
TypedArray attrsArray = getContext().obtainStyledAttributes(attrs,
R.styleable.CabSearchView, defStyleAttr, 0);
setCabEnabled(attrsArray.getBoolean(R.styleable.CabSearchView_cabEnabled,
DEFAULT_CAB_ENABLED));
attrsArray.recycle();
}
private class Callback implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
menu.add(0, IMAGESEARCH, 0,
"ImageSearch").setIcon(R.drawable.ic_camera_white_24dp);
return isCabEnabled();
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) { }
}
private static class PlainTextInputFilter implements InputFilter {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart, int dend) {
return RichTextUtil.stripRichText(source, start, end).subSequence(start, end);
}
}
}
В другом случае я пробовал это:
ImageView camImageView = new ImageView(this.fragment.getActivity());
camImageView .setImageResource(R.drawable.ic_camera_white_24dp);
((LinearLayout) searchView.getChildAt(0)).addView(camImageView,0);
В этом случае изображение отображается в крайнем левом углу фактического searchView.
Я ожидал, что значок будет включен в searchTextview перед кнопкой закрытия, но он либо не отображается, либо отображается в крайнем левом или правом углу, в зависимости от его размещения в качестве дочернего представления searchTextView.
Ожидаемый
Ток