【问题标题】:Extending Android SearchView扩展 Android SearchView
【发布时间】: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


【解决方案1】:

我使用了一个简单的搜索视图,它应该也适用于您的搜索视图类。

下面是代码。

SearchView searchView = findViewById(R.id.searchView);

ImageView camImageView = new ImageView(this);
camImageView .setImageResource(R.drawable.ic_launcher_foreground);
int getTotalChild = searchView.getChildCount();
((LinearLayout) searchView.getChildAt(getTotalChild-1)).addView(camImageView);

在您的情况下,代码最后一行的索引应该是getTotalChild - 2。 它应该可以工作。

【讨论】:

  • 检查这一行((LinearLayout) searchView.getChildAt(getTotalChild-1)).addView(camImageView);我没有使用addView的索引。
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多