当用户没有输入任何内容时,我想在SearchView中显示一些默认建议。 我正在使用矩阵光标手动设置我的自定义建议适配器。我尝试在onFocusChange和onClickListner中设置适配器,但建议隐藏在键盘后面,显然建议比键盘更早加载。 我没有找到任何监听器告诉我searchview在视图中完全加载了键盘。 帮助我找到正确的解决方案或任何解决方法。我尝试了一种解决方法postDelayed,但这并不是一种顺畅的体验。
我在onCreateOptionsMenu
中有这个代码@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.clear();
final MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.searchview_in_menu, menu);
this.menu=menu;
basketProductCount = ShoppinglistDataSource.get(getContext()).getProductCountToOrder();
if(basketProductCount>0 && menu!=null){
this.activateBasket();
}
SearchManager manager = (SearchManager) getSystemService(SEARCH_SERVICE);
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) searchMenuItem.getActionView();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
int searchButtonId = mSearchView.getContext().getResources().getIdentifier("android:id/search_button", null, null);
ImageView searchButton = (ImageView) mSearchView.findViewById(searchButtonId);
if(searchButton!=null)
searchButton.setImageResource(R.drawable.search);
mSearchView.setSearchableInfo(manager.getSearchableInfo(new ComponentName(getApplicationContext(), SearchProductActivity.class)));
mSearchView.setIconifiedByDefault(true);
mSearchView.setIconified(true);
mSearchView.setQueryHint("Search from 4000+ products");
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
Log.d("SEARCH_VIEW_DEBUG","Inside onQueryTextSubmit for query: "+s);
mSearchView.clearFocus();
mSearchView.setIconified(true);
//return false to let the SearchView perform the default action
return false;
}
@Override
public boolean onQueryTextChange(String query) {
query = query.toLowerCase().trim();
Log.d("Query changed to ",query);
if (query.length() > 1) {
Bundle b = new Bundle();
b.putString("query",query);
if(getLoaderManager().getLoader(1)!=null)
getLoaderManager().restartLoader(1, b, suggestionLoaderCallback);
else
getLoaderManager().initLoader(1, b, suggestionLoaderCallback);
}
return true;
}
});
mSearchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean queryTextFocused) {
Log.d("DEBUGGIN", "onFocusChange");
if(!queryTextFocused) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mSearchView.onActionViewCollapsed();
mSearchView.clearFocus();
}
} else {
/**This is doing the trick, but not smooth experience**/
/**also suggestions may get behind the keyboard if keyboard takes time to pop up**/
view.postDelayed(new Runnable() {
@Override
public void run() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mSearchView.onActionViewExpanded();
Log.d("DEBUGGIN", "Inside expand");
if (mSearchView.getQuery().length() == 0) {
Log.d("DEBUGGIN", "getting default suggestions");
sug.clear();
sug.add("Personal Care");
sug.add("Oil");
sug.add("Spices");
sug.add("Breakfast");
sug.add("Snacks");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
String[] columns = new String[]{"_id", "text"};
Object[] temp = new Object[]{0, "default"};
final MatrixCursor cursor = new MatrixCursor(columns);
int i = 0;
for (i = 0; i < sug.size(); i++) {
if (!sug.get(i).equals("")) {
temp[0] = i;
temp[1] = sug.get(i);
cursor.addRow(temp);
}
}
Log.d("Initial categories", sug.toString());
mSearchView.setSuggestionsAdapter(new CustomSuggestionAdapter(ListAll.this, cursor, sug));
mSearchView.getSuggestionsAdapter().notifyDataSetChanged();
mSearchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionSelect(int i) {
Log.d("SEARCH_VIEW_DEBUG", "Inside onSuggestionSelect");
return false;
}
@Override
public boolean onSuggestionClick(int i) {
Log.d("SEARCH_VIEW_DEBUG", "Inside onSuggestionClick");
MatrixCursor cursor = (MatrixCursor) mSearchView.getSuggestionsAdapter().getItem(i);
String suggest1 = cursor.getString(cursor
.getColumnIndex("text"));
Log.d("Clicked Item", suggest1);
mSearchView.setQuery(suggest1, true);
return true;
}
});
}
}
}
}
}, 600);
}
}
});
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
/**This never gets called**/
Log.d("DEBUGGIN", "Inside onMenuItemActionExpand");
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
/**This never gets called**/
Log.d("DEBUGGIN", "Inside onMenuItemActionCollapse");
return true;
}
});
} else {
MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
/**This never gets called**/
Log.d("DEBUGGIN", "Inside MenuItemCompat onMenuItemActionExpand");
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
/**This never gets called**/
Log.d("DEBUGGIN", "Inside MenuItemCompat onMenuItemActionCollapse");
return true;
}
});
}
//return true onCreateOptionsMenu
return true;
}
答案 0 :(得分:6)
您可以在MenuItem
上设置展开/解除收听者,如下所示:
menuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
此侦听器是在API级别14中引入的,因此为了向后兼容,您必须使用v4支持库。如果你这样做,你必须像这样设置展开/折叠监听器:
MenuItemCompat.setOnActionExpandListener(this.searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
答案 1 :(得分:1)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
vwSearch = (SearchView) menu.findItem(R.id.menu_main_search).getActionView();
vwSearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
//Do something on Submit
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//Do something on change
return true;
}
});
vwSearch.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
//Do something on collapse Searchview
return false;
}
});
return true;
}
答案 2 :(得分:1)
提问者想知道如何知道何时扩展搜索视图。只需在您的searchview中执行此操作即可(假设它是独立视图,但是如果需要,您可以从菜单项中获得对其的引用):
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//search is expanded
}
});
这是封闭情况:
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
// searchview closed
return false;
}
});
答案 3 :(得分:-1)
尝试在AndroidManifest.xml中添加此项以及您的活动,例如您的活动名称为activity1。
<activity
android:name="com.example.app1.activity1"
android:label="@string/title_activity_one"
android:windowSoftInputMode="adjustPan" >
</activity>
而不是“adjustPan”,您可以使用“adjustResize”