我正在尝试将搜索功能合并到我的一个应用程序中,并且在显示多个搜索视图的问题上遇到了问题。
因此,当我在Action Bar中单击"搜索"图标时,我会得到一个占据整个动作栏的"搜索视图",并且还有另一个"搜索视图",它要么藏在顶部视图下方,要么在顶部视图后呈现。被摧毁了,我不确定哪个我无法追踪它。底部/秒呈现的搜索视图是我想要的实际视图。当我提出搜索请求时,顶视图正常运行,但是当我导航回到搜索呼叫的活动时,原始搜索视图已消失,并且现在已经到位了正确的搜索视图。然后,它正常运行,直到我关闭/折叠搜索视图为止。原始的搜索视图也可以通过屏幕上任何地方的触摸视图关闭,并且正确的搜索视图正在启动并等待输入。
关于造成这种情况的原因有什么想法?
bar触摸搜索图标之前:
带有两种视图的栏:
bar带有正确视图的栏:
这是我的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" />
主要活动,其中称为:
@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();
}
}
}
似乎您以2种不同的方式对搜索界面进行了双重实现。如果您查看在操作栏中设置搜索界面的官方文档,您会注意到它不会提及在OnOptionsItemselect中调用starterearch。尝试从OnOptionsItemselected中删除它,看看会发生什么。
编辑:经过进一步的研究,看来您可能已经尝试实现此处概述的两个实现,但是只有一个或另一个是必要的(尽管除非您使用ABS或AppCompat,否则只有一个或更高的作用)。