我正在尝试将搜索功能合并到我的某个应用程序中,并且在解决显示多个SearchView的问题时遇到问题。
因此,当我点击操作栏中的“搜索”图标时,我会看到占据整个操作栏的“搜索视图”,还有另一个“搜索视图”隐藏在顶视图下方或者在顶视图后呈现被摧毁了,我不确定哪个,因为我无法追踪它。
在底部/秒上呈现的SearchView是我想要的实际视图。当我发出搜索请求时,顶视图功能正常,但当我导航回进行搜索调用的活动时,原始的SearchView消失了,现在正确的SearchView就位。然后它会正常运行,直到我关闭/折叠SearchView。
原始SearchView也可以通过屏幕上任何位置的touchEvent关闭,并且正确的SearchView已启动并等待输入。
关于导致这种情况的任何想法?
触摸搜索图标前栏:
包含两种观点的栏:
正确观点栏:
这是我的searchable.xml:
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search_label"
android:hint="@string/search_hint"
android:searchSettingsDescription="@string/settings_description" />
我的菜单xml文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
android:title="@string/menu_search"
android:icon="@drawable/ic_menu_search"
android:orderInCategory="0"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="ifRoom|collapseActionView" />
我的清单片段:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="adjustPan" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="SearchMainActivity"
android:finishOnTaskLaunch ="true"
android:configChanges="keyboard|keyboardHidden|orientation"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<meta-data
android:name="android.app.default_searchable"
android:value="SearchMainActivity" />
调用onCreateOptionsMenu的主要活动:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.options_menu, menu);
MenuItem searchItem = menu.findItem(R.id.search);
if(searchItem != null && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)) {
SearchView searchView = (SearchView) searchItem.getActionView();
if(searchView != null) {
SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
}
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
startSearch(null, false, Bundle.EMPTY, false);
return true;
}
break;
default:
return false;
}
return super.onOptionsItemSelected(item);
}
我的SearchActivity.java
public class SearchMainActivity extends FragmentActivity implements SearchListFragment.OnSearchListItemSelectedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
SearchQuery.query = intent.getStringExtra(SearchManager.QUERY);
SearchQuery.original_query = SearchQuery.query;
SearchQuery.query = SearchQuery.query.toLowerCase().trim().replaceAll("'", "''").replaceAll("[^A-Za-z0-9\\.\\-\\'\\\" ]", "");
}
setContentView(R.layout.search_main_layout);
if(findViewById(R.id.fragment_container) != null) {
if(savedInstanceState != null) {
return;
}
SearchListFragment listFrag = new SearchListFragment();
listFrag.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, listFrag).commit();
}
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
SearchQuery.query = intent.getStringExtra(SearchManager.QUERY);
startActivity(intent);
}
@Override
public void onSearchListItemSelected(int position, View v) {
SearchDetailFragment detailFrag = (SearchDetailFragment)
getSupportFragmentManager().findFragmentById(R.id.main_list_detail_fragment);
if(detailFrag != null) {
detailFrag.updateMainDetailView(position);
}
else {
SearchDetailFragment searchDetailFragment = new SearchDetailFragment();
Bundle args = new Bundle();
args.putInt(BaseDetailFragment.CURRENT_LIST_POSITION, position);
searchDetailFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, searchDetailFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
}
答案 0 :(得分:1)
您似乎以两种不同的方式双重实施搜索界面。如果你看一下official docs on setting up a search interface in the action bar,你会注意到它没有提到在onOptionsItemSelected中调用startSearch。尝试从onOptionsItemSelected中删除它,看看会发生什么。
编辑:经过进一步的研究,看起来你可能已经尝试过实现两个概述here的实现,但只有一个或另一个是必要的(尽管一个只适用于Honeycomb及以上,除非你使用ABS或AppCompat)。