-->

Android的:如何检测单击自定义搜索查看元素(Android: How to detect cl

2019-07-19 00:31发布

我米创建一个自定义搜索查看,但到目前为止,我没有找到一个(点击)事件或监听器,如果用户点击搜索查看小部件。 所以搜索查看接近,用户点击搜索图标(监听?!),搜索查看被打开。 见下图。 我需要一个事件,因为我希望用户打开搜索查看后更改UI

编辑:我试过到目前为止

  • setOnClickListener到搜索查看元素- >但它只有在搜索查看已打开(第2图)触发

  • 搜索SearchView的API,但没有支持该行动的监听器(或我瞎了?)

  • 试图用一种变通方法onWindowFocusChanged的搜索查看的,但由于一个事实,即搜索查看隐藏在某种的YouTube / Facebook的侧边栏,这是行不通

有任何想法吗? 我重视我的搜索查看代码为好,但不认为该代码是错误的。 只是没有监听器呢。 BTW:任何变通办法是值得欢迎的。 不过,这将是很好,如果搜索查看是在开始营业! (如上面的图片)

public class AmplifySearchView extends SearchView implements
        OnQueryTextListener, OnFocusChangeListener,
        OnCloseListener {

    private static final String DEBUG_TAG = "AmplifySeachView";

    private Context context;
    private DataBaseController datasource;
    private StationListView searchResultListView;
    private TextView noResultTextView;

    private Boolean searchStarted = false;

    public AmplifySearchView(Context context) {
        super(context);
        this.context = context;
    }

    public AmplifySearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    public void initSearchView(StationListView view, TextView noResultTextView) {
        this.searchResultListView = view;
        this.searchResultListView.setActivityId(Constants.UI_SEARCH_RESULT_LIST);
        this.noResultTextView = noResultTextView;


        this.setOnQueryTextListener(this);
        this.setOnFocusChangeListener(this);
        this.setOnCloseListener(this);
        this.setOnCloseListener(this);

        setIconifiedByDefault(true);

        datasource = DataBaseController.getInstance(context);

        int id = this.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView textView = (TextView) findViewById(id);
        textView.setTextColor(Color.WHITE);


        resetSearchInputTextField();
    }

    private void resetSearchInputTextField() {
        setQueryHint(getResources().getString(R.string.search_hint));
    }

    @Override
    public boolean onClose() {
        Log.d(DEBUG_TAG, "onClose()");
        searchResultListView.setVisibility(View.GONE);
        noResultTextView.setVisibility(View.GONE);

        searchStarted = false;

        Intent intent = new Intent(Constants.SEARCH_ENDED);
        intent.addCategory(Constants.UI_AMPLIFY_CATEGORY);
        context.sendBroadcast(intent);

        return false;
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        Log.d(DEBUG_TAG,"onFocusChange()" + hasFocus);

    }


    @Override
    public boolean onQueryTextChange(String newText) {

        //do sth...
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        Log.d(DEBUG_TAG, "onQueryTextSubmit -> " + query);
        return true;
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction,
            Rect previouslyFocusedRect) {
        Log.d(DEBUG_TAG, "onQueryTextSubmit -> " + gainFocus);
        // TODO Auto-generated method stub
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
    }

    @Override
    public void onActionViewCollapsed() {
        Log.d(DEBUG_TAG, "onActionViewCollapsed");
        super.onActionViewCollapsed();
    }

    @Override
    public void onActionViewExpanded() {
        Log.d(DEBUG_TAG, "onActionViewExpanded");
        super.onActionViewExpanded();
    }
}

BTW:对分众的变化并不在这里工作,因为搜索查看是在一开始不可见,在UI后插入...

Answer 1:

这个怎么样?

public void setOnSearchClickListener (View.OnClickListener listener)

从Android开发者网站上介绍说..设置一个监听器被按下搜索按钮时告知。 这仅仅是相关的,当文本字段默认情况下不可见。 调用setIconified(假)也可能导致这个监听器被告知。

http://developer.android.com/reference/android/widget/SearchView.html#setOnSearchClickListener(android.view.View.OnClickListener)



Answer 2:

 public void setOnSearchClickListener (View.OnClickListener listener)

解决了这个问题。 其实我觉得我一直在使用之前,这个监听器,但OnSearchClickListener不是OnClickListener在我搜索查看。 你必须从外界宣布,听众喜欢

 AmplifySearchView sv = (AmplifySearchView) findViewById(...);

 sv.setOnSearchClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Log.d("CLICK","CLICK");

        }
 });


Answer 3:

对于文本字段可见使用:

SearchView searchView = (SearchView) findViewById(R.id.searchView);
    searchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //your code here
        }
    });

对于文本字段看不见的使用:

searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            //your code here
            return false;
        }
    });


Answer 4:

在科特林试试这个:

    searchView.setOnQueryTextFocusChangeListener { _ , hasFocus ->
        if (hasFocus) {
            // searchView expanded
        } else {
            // searchView not expanded
        }
    }

在Java:

searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // searchView expanded
        } else {
            // searchView not expanded
        }
    }
});


Answer 5:

这与API 15.尚未经过测试写入。 在底部的细节。

public class MySearchView extends SearchView {
    private boolean mHasFocus;
    private OnOpenListener mOnOpenListener;

    public MySearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setOnOpenListener(OnOpenListener onOpenListener) {
        mOnOpenListener = onOpenListener;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean onTouchEvent = super.onTouchEvent(event);

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (!mHasFocus) {
                mHasFocus = true;

                if (mOnOpenListener != null) {
                    mOnOpenListener.onOpen();
                }
            }

            break;
        }

        return onTouchEvent;
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);

        if (!gainFocus) {
            mHasFocus = false;
        }
    }

    public interface OnOpenListener {
        public void onOpen();
    }
}

你给它一个OnOpenListener并点击查看时,它会触发事件。 当它失去焦点将重新设置布尔值。 我认为它会火的是已经建成的OnClose藏汉什么可以是一个问题是焦点位。 我曾使用搜索查看之前的问题,它不会放弃它的焦点。 也许你可以在课堂之外分配时,应查看具有焦点与否。 如果你想要更多的功能,你必须建立自己的。



文章来源: Android: How to detect click on custom SearchView element