web-dev-qa-db-ja.com

Android:カスタムSearchView要素のクリックを検出する方法

私はカスタムSearchViewを作成していますが、これまでのところ、ユーザーがsearchViewウィジェットをクリックしても、(クリック)イベントまたはリスナーは見つかりませんでした。 SearchViewが閉じているので、ユーザーは検索アイコン(どのリスナー?!)をクリックし、SearchViewを開きます。下の写真をご覧ください。ユーザーがsearchViewを開いた後にUIを変更するため、そのイベントが必要です。

enter image description here

編集:私がこれまで試したのは

  • setOnClickListenerをSearchView要素に->ただし、SearchViewが開いている場合にのみトリガーされます(2番目の図)

  • SearchView Apiを検索しましたが、そのアクションのリスナーがいません(または私は盲目ですか?)

  • searchViewのonWindowFocusChangedで回避策を試しましたが、searchViewが何らかの種類のyoutube/facebookサイドバーで非表示になっているため、これは機能しません。

何か案は? SearchViewコードも添付しましたが、コードが間違っているとは思わないでください。まだリスナーがいません。 btw:回避策は大歓迎です。ただし、SearchViewが最初に閉じられている場合、それは素晴らしいでしょう! (上の写真のように)

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:フォーカスの変更はここでは機能しません。searchviewは最初は表示されず、後でUIに挿入されるためです...

31
longilong

これはどう?

public void setOnSearchClickListener (View.OnClickListener listener)

Android開発者ウェブサイトは言う。検索ボタンが押されたときに通知するリスナーを設定します。これはデフォルトでテキストフィールドが表示されていない場合にのみ関連します。setIconified(false)このリスナーに通知します。

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

55
chuthan20
 public void setOnSearchClickListener (View.OnClickListener listener)

問題を解決します。実際、私は以前にこのリスナーを使用したことがあると思っていましたが、OnSearchClickListenerはSearchViewのOnClickListenerではありません。そのリスナーを外部から宣言する必要があります

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

 sv.setOnSearchClickListener(new OnClickListener() {

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

        }
 });
8
longilong

テキストフィールドの表示用:

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;
        }
    });
7
Davi Menezes

Kotlinでこれを試してください:

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

In Java:

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

これは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も起動すると思います。問題になるのはフォーカスビットです。 SearchViewを使用する前に問題が発生しましたが、フォーカスをあきらめません。クラスの外で、ビューにフォーカスするかどうかを割り当てることができます。より多くの機能が必要な場合は、独自の機能を構築する必要があります。

2