【发布时间】:2020-02-07 11:16:53
【问题描述】:
我的应用程序中有一个自定义的 Android SearchView。我正在尝试通过为 ImageSearch 功能添加自定义图标相机来扩展它。
我试图通过使用它的 searchTextView 的 onCreateActionMode 来扩展它,但是图标没有显示出来。我希望 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 的子视图的位置。
预期
当前
【问题讨论】:
-
添加预期视图和当前视图图像,以便您理解您面临的问题。
-
我已经用图片编辑了问题,请检查。
-
而不是这个 ((LinearLayout) searchView.getChildAt(0)).addView(camImageView,0);首先获取总子数,然后使用 ((LinearLayout) searchView.getChildAt(total_child - 1)).addView(camImageView,0);我想这应该可行。
-
@Simplyprogrammer,它不起作用。
-
您是否遇到任何错误,或者输出不符合预期。
标签: android search searchview extend