SearchView 图标显示两次
SearchView icon shows twice
我已经按照 Android 的官方说明在我的工具栏中实现了 SearchView。
SearchView 本身运行良好,但是当我点击搜索图标时,它会向左移动而不是显示“搜索提示和关闭”按钮,尽管如果我单击此 "second Search" 图标,最终我会得到典型的搜索视图。
这是我的 xml 工具栏:
<item android:id="@+id/search"
android:title="@string/search_view"
app:showAsAction="collapseActionView|ifRoom"
android:iconTint="@android:color/white"
android:icon="@drawable/ic_search_white_24dp"
app:actionViewClass="android.widget.SearchView" />
还有我的 onCreateOptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return true;
}
还有我的manifest.xml
<activity
android:name=".Activities.MainActivity"
android:label="@string/addWordLabel_Act"
android:launchMode="singleTop"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
最后,这里有一些问题的截图:
SearchView before tapping
SearchView after first tap, Here's the problem
SearchView after second tap, "the normal SearchView"
仅此而已。
注意:我还没有实现 Activity/Fragment 来处理搜索。
终于找到解决办法了。这很容易,但我花了两天时间想弄明白。
只是,兼容性问题,使用
app:actionViewClass="android.support.v7.widget.SearchView"
而不是app:actionViewClass="android.widget.SearchView"
当然还有改变
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
来自
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
android.support.v7.widget.SearchView searchView =
(android.support.v7.widget.SearchView) menu.findItem(R.id.search).getActionView();
Androidx解决方案
添加此答案是因为我的声誉不足以回复 Wesley Franks
布局
app:actionViewClass="androidx.appcompat.widget.SearchView"
Activity(科特林)
menu?.findItem(R.id.search)?.actionView as? androidx.appcompat.widget.SearchView
Activity (Java)
(androidx.appcompat.widget.SearchView) menu.findItem(R.id.search).getActionView();
这是这个问题的最佳答案
@Override
public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_main, menu);
MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
final androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) myActionMenuItem.getActionView();
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchView.setQuery("", false);
searchView.setIconified(true);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//Do your stuff
return true;
}
});
}
如果上述解决方案的 none 对您有效,就像我的情况一样:
只需将背景颜色设置为 SearchView。
而且您只会看到 1 个放大镜图标。
在调用菜单项之前先清除菜单。
menu.clear();
完整代码
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.main, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.appSearchBar).getActionView();
searchView.setQueryHint("Search...");
searchView.setIconified(false);
使用 onCreateOptionsMenu 因为我在 Fragment 中调用它。
我已经按照 Android 的官方说明在我的工具栏中实现了 SearchView。
SearchView 本身运行良好,但是当我点击搜索图标时,它会向左移动而不是显示“搜索提示和关闭”按钮,尽管如果我单击此 "second Search" 图标,最终我会得到典型的搜索视图。
这是我的 xml 工具栏:
<item android:id="@+id/search"
android:title="@string/search_view"
app:showAsAction="collapseActionView|ifRoom"
android:iconTint="@android:color/white"
android:icon="@drawable/ic_search_white_24dp"
app:actionViewClass="android.widget.SearchView" />
还有我的 onCreateOptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return true;
}
还有我的manifest.xml
<activity
android:name=".Activities.MainActivity"
android:label="@string/addWordLabel_Act"
android:launchMode="singleTop"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
最后,这里有一些问题的截图: SearchView before tapping
SearchView after first tap, Here's the problem
SearchView after second tap, "the normal SearchView"
仅此而已。
注意:我还没有实现 Activity/Fragment 来处理搜索。
终于找到解决办法了。这很容易,但我花了两天时间想弄明白。
只是,兼容性问题,使用
app:actionViewClass="android.support.v7.widget.SearchView"
而不是app:actionViewClass="android.widget.SearchView"
当然还有改变
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
来自
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
android.support.v7.widget.SearchView searchView =
(android.support.v7.widget.SearchView) menu.findItem(R.id.search).getActionView();
Androidx解决方案
添加此答案是因为我的声誉不足以回复 Wesley Franks
布局
app:actionViewClass="androidx.appcompat.widget.SearchView"
Activity(科特林)
menu?.findItem(R.id.search)?.actionView as? androidx.appcompat.widget.SearchView
Activity (Java)
(androidx.appcompat.widget.SearchView) menu.findItem(R.id.search).getActionView();
这是这个问题的最佳答案
@Override
public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_main, menu);
MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
final androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) myActionMenuItem.getActionView();
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchView.setQuery("", false);
searchView.setIconified(true);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//Do your stuff
return true;
}
});
}
如果上述解决方案的 none 对您有效,就像我的情况一样: 只需将背景颜色设置为 SearchView。 而且您只会看到 1 个放大镜图标。
在调用菜单项之前先清除菜单。
menu.clear();
完整代码
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.main, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.appSearchBar).getActionView();
searchView.setQueryHint("Search...");
searchView.setIconified(false);
使用 onCreateOptionsMenu 因为我在 Fragment 中调用它。