Расширение Android SearchView - PullRequest
       17

Расширение Android SearchView

0 голосов
/ 10 октября 2019

У меня есть собственный 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.


Ожидаемый

Expected Image


Ток

Current Result

1 Ответ

0 голосов
/ 14 октября 2019

Я использовал простое представление поиска, оно должно работать и с вашим классом поиска.

Ниже приведен код.

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 для последней строки в коде. Это должно работать.

...