Android 应用程序恢复后触发onQueryTextChange
我在QueryTextListener上安装了动画searchview。当第一次创建活动和片段时,效果很好。然后我按home按钮,打开其他应用程序,在那里做一些工作来擦除searchview活动的数据,然后返回应用程序。当活动和片段恢复时,onQueryTextChange方法由其自身触发。我试过这个问题 但它没有帮助,只有当searchview显示为“动作”时才有帮助,但在这种情况下,我看不到searchview。如何防止OnQueryTextListener的自触发? 片段中的片段Android 应用程序恢复后触发onQueryTextChange,android,triggers,searchview,onresume,textchanged,Android,Triggers,Searchview,Onresume,Textchanged,我在QueryTextListener上安装了动画searchview。当第一次创建活动和片段时,效果很好。然后我按home按钮,打开其他应用程序,在那里做一些工作来擦除searchview活动的数据,然后返回应用程序。当活动和片段恢复时,onQueryTextChange方法由其自身触发。我试过这个问题 但它没有帮助,只有当searchview显示为“动作”时才有帮助,但在这种情况下,我看不到searchview。如何防止OnQueryTextListener的自触发? 片段中的片段 @Ove
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
searchView = new SearchView(getSherlockActivity().getSupportActionBar()
.getThemedContext());
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.length() > 0) {
fpAdapter.getFilter().filter(newText);
} else {
loadData();
}
return false;
}
});
TextView searchText = (TextView) searchView
.findViewById(R.id.abs__search_src_text);
searchText.setTextColor(Color.WHITE);
searchText.setCursorVisible(false);
ImageView searchButton = (ImageView) searchView
.findViewById(R.id.abs__search_button);
searchButton.setImageResource(R.drawable.search_menu_button);
LinearLayout searchEditFrame = (LinearLayout) searchView
.findViewById(R.id.abs__search_edit_frame);
searchEditFrame.setBackgroundResource(android.R.color.transparent);
View searchPlate = searchView.findViewById(R.id.abs__search_plate);
searchPlate.setBackgroundColor(Color.argb(0, 0, 0, 0));
menu.add("Search")
.setActionView(searchView)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
final MenuItem searchMenuItem = menu.getItem(0);
final Animation in = AnimationUtils.loadAnimation(getSherlockActivity()
.getApplicationContext(), R.anim.search_in);
final Animation out = AnimationUtils.loadAnimation(
getSherlockActivity().getApplicationContext(),
R.anim.search_out);
searchView.setQueryHint(getResources().getText(
R.string.search_messages_hint));
searchView.setIconifiedByDefault(true);
searchView
.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view,
boolean queryTextFocused) {
if (!queryTextFocused) {
// searchView.startAnimation(out);
searchMenuItem.collapseActionView();
} else {
searchView.startAnimation(in);
}
}
});
super.onCreateOptionsMenu(menu, inflater);
}
更新:这只出现在4.2版本的带有Android 4.0.3的HTC sensation XL中。我看不出这个问题。在onResume中找到了唯一的解决方案-设置侦听器:
@Override
public void onResume() {
super.onResume();
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.length() > 0) {
fpAdapter.getFilter().filter(newText);
} else {
loadData();
}
return false;
}
}); }
使用此代码
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(final String s) {
if(searchView.getWidth()>0)
{
// your code here
}
return false;
}
});
您可以设置为仅在焦点处使用
SearchView
。我遇到了一个类似的问题,每次用户恢复搜索时,搜索都会在我的片段中执行。我用以下方法解决它:
-添加布尔值以查看SearchView
何时处于焦点:
//默认情况下,SearchView不在焦点中,因此将其设置为false。
私有布尔值shouldSearch=false代码>
searchView.setOnQueryTextFocusChangeListener((view, hasFocus) -> {
if (hasFocus) {
shouldSearch = true;
} else {
shouldSearch = false;
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (shouldSearch) {
//do your search here
}
return true;
}
});
这是一个众所周知的问题。您可以通过检查搜索是否“图标化”(即仅显示放大镜图标)或是否已展开(这意味着用户正在与搜索视图交互)来修复此问题
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
//your code here
return true
}
override fun onQueryTextChange(newText: String?): Boolean {
//this will catch firing event
if (searchView.isIconified) {
return true
}
//your code here
return true
}
})