私はカスタムSearchViewを作成していますが、これまでのところ、ユーザーがsearchViewウィジェットをクリックしても、(クリック)イベントまたはリスナーは見つかりませんでした。 SearchViewが閉じているので、ユーザーは検索アイコン(どのリスナー?!)をクリックし、SearchViewを開きます。下の写真をご覧ください。ユーザーがsearchViewを開いた後にUIを変更するため、そのイベントが必要です。
編集:私がこれまで試したのは
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に挿入されるためです...
これはどう?
public void setOnSearchClickListener (View.OnClickListener listener)
Android開発者ウェブサイトは言う。検索ボタンが押されたときに通知するリスナーを設定します。これはデフォルトでテキストフィールドが表示されていない場合にのみ関連します。setIconified(false)このリスナーに通知します。
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");
}
});
テキストフィールドの表示用:
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;
}
});
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
}
}
});
これは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を使用する前に問題が発生しましたが、フォーカスをあきらめません。クラスの外で、ビューにフォーカスするかどうかを割り当てることができます。より多くの機能が必要な場合は、独自の機能を構築する必要があります。