Android搜索接口 - 显示多个搜索视图



我正在尝试将搜索功能合并到我的一个应用程序中,并且在显示多个搜索视图的问题上遇到了问题。
因此,当我在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,否则只有一个或更高的作用)。

最新更新