SearchView의 지우기 버튼 클릭을 어떻게 캡처합니까?
SearchView
오른쪽의 X 버튼을 클릭하여 일반 텍스트를 클릭 하는 이벤트를 캡처하려면 어떻게해야합니까?
이미 onQueryTextChange
이벤트를 캡처 했지만 해당 X 버튼이 아닌 모든 텍스트 변경 용입니다.
많은 조합을 시도한 후 SearchView에서 X 버튼 뒤에있는 이벤트를 캡처하는 방법을 찾았습니다.
아래는 onCreateOptionsMenu
내 앱 중 하나에있는 함수 의 코드 스 니펫입니다 . mSearchMenu
및 mSearchView
글로벌 변수입니다. X는 실제로 ID가있는 ImageView search_close_btn
이고 텍스트 영역은 ID가있는 EditText보기입니다.search_src_text
@SuppressLint("NewApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.country_list_activity_actions, menu);
mSearchMenu = menu.findItem(R.id.action_search);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
// Assumes current activity is the searchable activity
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
mSearchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
// Get the search close button image view
ImageView closeButton = (ImageView)mSearchView.findViewById(R.id.search_close_btn);
// Set on click listener
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoggerUtils.d(LOG, "Search close button clicked");
//Find EditText view
EditText et = (EditText) findViewById(R.id.search_src_text);
//Clear the text from EditText view
et.setText("");
//Clear query
mSearchView.setQuery("", false);
//Collapse the action view
mSearchView.onActionViewCollapsed();
//Collapse the search widget
mSearchMenu.collapseActionView();
}
});
}
// When using the support library, the setOnActionExpandListener() method is
// static and accepts the MenuItem object as an argument
mSearchMenu.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
//Nothing to do here
LoggerUtils.d(LOG, "Search widget expand ");
return true; // Return true to expand action view
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
LoggerUtils.d(LOG, "Search widget colapsed ");
return true; // Return true to collapse action view
}
});
return super.onCreateOptionsMenu(menu);
}
onCloseListener ()를 사용할 수 있습니다.
sv= (SearchView) findViewById(R.id.searchView1);
sv.setOnCloseListener(new OnCloseListener() {
@Override
public boolean onClose() {
Toast t = Toast.makeText(MainActivity.this, "close", Toast.LENGTH_SHORT);
t.show();
return false;
}
});
ID로 구성 요소를 찾는 데 문제가 있었지만 동일한 SearchView의 컨텍스트를 사용하여이 구성 요소를 검색하는 다른 방법을 찾았습니다.
// Catch event on [x] button inside search view
int searchCloseButtonId = searchView.getContext().getResources()
.getIdentifier("android:id/search_close_btn", null, null);
ImageView closeButton = (ImageView) this.searchView.findViewById(searchCloseButtonId);
// Set on click listener
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Manage this event.
}
});
이 코드를 사용하여 텍스트 쿼리 지우기를 포착하고 내 작업을 수행합니다.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.search_button).getActionView();
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String cs) {
if (TextUtils.isEmpty(cs)){
//Text is cleared, do your thing
}
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
//text query submitted
}
};
searchView.setOnQueryTextListener(textChangeListener);
return true;
}
If you use Appcompat library, instead of using
getResources().getIdentifier("android:id/search_close_btn", null, null);
you can do this:
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
View closeButton = searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//handle click
}
});
EDIT AUGUST 2019:
If you use androidx: androidx.appcompat.R.id.search_close_btn
ImageView closeButton = (ImageView) this.searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Manage this event.
}
});
Use R.id.search_go_btn for "Submit" Button
A kotlin answer:
mySearchView.setOnCloseListener(object : SearchView.OnCloseListener {
override fun onClose(): Boolean {
// Do your stuff
return false
}
})
참고URL : https://stackoverflow.com/questions/24794377/how-do-i-capture-searchviews-clear-button-click
'Program Tip' 카테고리의 다른 글
Qt 링커 오류 : "vtable에 대한 정의되지 않은 참조" (0) | 2020.12.02 |
---|---|
CSS에서 최소 글꼴 크기를 설정하는 방법 (0) | 2020.12.02 |
해결 실패 : com.android.support.design:25.4.0 (0) | 2020.12.02 |
GCC에서 "정의되었지만 사용되지 않음"경고를 숨기려면 어떻게해야합니까? (0) | 2020.12.02 |
열린 'fancybox'내에서 함수에서 멋진 상자를 닫습니다. (0) | 2020.12.02 |