
我正在尝试使用ActionBar Sherlock实现Action Bar.我有三个Action Button,其中一个是Search Button.在单击搜索按钮时,应显示已经实现的搜索输入字段.但我希望它占据Action Bar的全部宽度.任何想法我怎么能实现同样的目标.
我有一个可折叠SearchView的ActionBar.执行搜索后,将关联关联ListView以仅显示匹配项.在该状态期间,SearchView仍然会展开并显示搜索字符串.如果用户关闭SearchView,我删除过滤器.
我想恢复搜索状态,例如,在配置更改时,或者当我从另一个活动返回活动时,活动是否被销毁.
我恢复查询字符串onRestoreInstanceState(),如果我在onCreateOptionsMenu()调用中找到查询字符串
searchView.setQuery(query, true);
Run Code Online (Sandbox Code Playgroud)
以便再次执行查询.事实证明,这比立即应用查询过滤器更好onRestoreInstanceState().对于后者,列表很快显示为未过滤,然后再次应用查询.有了setQuery()这不会发生.
问题:执行查询并过滤列表,但搜索视图仍保持折叠状态.因此,用户无法使用搜索视图删除过滤器或应用其他查询.
在onCreateOptionsMenu()我可以确定搜索项和搜索视图存在,因此我可以打电话searchItem.expandActionView().奇怪的是,只有这样才能真正扩展ActionView- 调用setIconified(false)不会扩展视图,即使连续两次调用它也不会.
如果我expandActionView()在打电话之前使用setQuery(),SearchView则打开并显示文本(否则expandActionView()清空SearchView).
不幸的是,expandActionView()有副作用:还会显示建议列表并打开键盘.
我可以使用隐藏键盘searchView.clearFocus().所以剩下的问题是建议清单.如何关闭SearchView包含文本的打开建议列表?
我想知道是否有更好的方法来恢复没有这么多副作用的操作栏中的搜索视图.
我目前正在使用SearchViewwidget ActionBarcompat来搜索时过滤列表.
当用户开始输入文本时,主布局中的ListView会使用适配器进行更新以过滤结果.我这样做是通过实现OnQueryTextListener并过滤每个键击的结果.
相反,我想创建一个类似Gmail的搜索框,其中包含生成的自动建议列表,并且不会更改基础视图

我已经阅读了使用该SearchView组件的本教程,但它需要一个可搜索的活动.我希望下拉列表位于MainActivity上,我有ListView(就像在Gmail应用程序中一样),而不是专用的Activity.
此外,以与教程相同的方式实现它似乎对我想要的东西(只是一个下拉列表)有点过分
我使用了" Android Action Bar Style Generator "来生成我自己的Holo主题.然后我在操作栏中添加了两个图标,一个用于searchFilter,另一个用于文件选择器,两个图标都是白色.文件选择器图标(在右侧)看起来不错,但不知何故搜索图标看起来是深灰色.在搜索文本视图中键入时,关闭按钮也显示为深灰色.
我尝试过更改动作栏的颜色以及搜索视图的颜色,但没有成功.为什么搜索视图显示此颜色?我该怎么改变它?

非常感谢你.
更新:我认为我的应用程序正在使用我的图标,但它没有,它使用默认的搜索视图图标,所以我的问题实际上是,如何更改搜索视图的默认图标?menu.xml文件中的这句话不起作用:
android:icon="@drawable/selectable_header_search"
Run Code Online (Sandbox Code Playgroud) 我有一个SearchView.当用户点击键盘搜索按钮时,我需要进行服务器调用.听众的代码是什么样的?我想我必须使用OnClickListener.但是知道它是搜索按钮的内部代码,我不知道如何确定.
我有2个活动:第一个有一个带有搜索视图的操作栏,第二个应该显示搜索查询的结果.
androidmanifest:
<activity
android:name=".SearchActivity"
...
android:launchMode="singleTop">
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
...
</activity>
<activity
android:name=".ResultsActivity"
...
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
searchable.xml
<searchable
xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/enter_a_word" />
Run Code Online (Sandbox Code Playgroud)
SearchActivity
....
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_noun_list, 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;
}
....
Run Code Online (Sandbox Code Playgroud)
ResultsActivity:
@Override
protected void onCreate(Bundle …Run Code Online (Sandbox Code Playgroud) 我正在尝试在主活动的搜索视图中显示提示文本.onqueryTextSubmit启动另一个名为SearchResultsActivity的活动,该活动将显示查询结果.我的问题是我无法显示提示文本.我的searchable.xml代码
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/search_hint"
android:label="@string/app_name"
/>
Run Code Online (Sandbox Code Playgroud)
和清单代码
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.SEARCH"/>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data
android:name="android.app.default_searchable1"
android:value=".SearchResultsActivity"
android:resource="@xml/searchable"/>
</activity>
<activity android:name=".SearchResultsActivity">
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable">
</meta-data>
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
最后我的onQueryTextSubmit代码
@Override
public boolean onQueryTextSubmit(String query)
{
Anniversaries tempResults;
tempResults = mainAnniversariesManager.searchManager.searchAnniversaries(query);
if (tempResults.entries.size() == 0)
{
snackbar = Snackbar.make(findViewById(R.id.coordinator), getString(R.string.no_results_found) + query, Snackbar.LENGTH_INDEFINITE);
snackbar.show();
return true;
} else
{
snackbar = null;
if (!searchView.isIconified())
{
searchView.setIconified(true);
}
menuItem.collapseActionView();
Intent intent=new Intent(getApplicationContext(),SearchResultsActivity.class);
Bundle …Run Code Online (Sandbox Code Playgroud) 背景
public Observable<List<Foo>> search(SearchView searchView) {
return RxSearchView.queryTextChanges(searchView)
.filter(charSequence -> !TextUtils.isEmpty(charSequence))
.throttleLast(100, TimeUnit.MILLISECONDS)
.debounce(200, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.flatMap(this::performSearch) //Search the DB
.onErrorResumeNext(this::doSomething);
}
Run Code Online (Sandbox Code Playgroud)
我试图用AndroidJUnit4跑步者测试上面的方法Mocktio.
@Test
public void testSearchCallsDataManager_WhenCalled() {
String input = "abc";
when(mockSearchView.getQuery()).thenReturn(input);
searchRequestManager.search(mockSearchView).subscribe(testSubscriber); //Using standard TestSubscriber
testSubscriber.assertNoErrors();
testSubscriber.assertNotCompleted();
verify(mockDataManager).getFoos(input);
}
Run Code Online (Sandbox Code Playgroud)
问题
我尝试过使用a mockSearchView和real SearchView.
mockSearchView = mock(SearchView.class);
searchView = new SearchView(InstrumentationRegistry.getContext(), null);
searchView = new SearchView(InstrumentationRegistry.getTargetContext(), null);
Run Code Online (Sandbox Code Playgroud)
在实例化期间,实际对象在测试运行时会导致不同的异常.模拟对象在执行期间似乎没有任何效果.
更新
为清楚起见:理想情况下,如果我可以模拟SearchView,那将是很好的,因为我想测试发生什么后发生的事情以及使用正确的输入调用performSearch方法.
我已经实现了动作栏SearchView,它工作正常,但在屏幕的底部显示了一个浮动文本弹出窗口.看截图:
ListView Java类:
@Override
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
mListView.clearTextFilter();
} else {
// EventAdapterView ca = (EventAdapterView)mListView.getAdapter();
// ca.getFilter().filter(newText.toString());
// Filter lFilter = mDataAdapter.getFilter();
// lFilter.filter("");
// following line was causing the ugly popup window.
mListView.setFilterText(newText.toString());
// EventAdapterView ca = (EventAdapterView)mListView.getAdapter();
// ca.getFilter().filter(newText.toString());
}
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
适配器类
@Override
public Filter getFilter() {
/**
* A filter object which will filter message key
* */
Filter filter …Run Code Online (Sandbox Code Playgroud) searchview ×10
android ×9
autocomplete ×1
dart ×1
flutter ×1
rx-android ×1
rx-java ×1
search ×1