Android搜索界面 - 显示多个SearchView

时间:2014-01-22 17:33:53

标签: java android views

我正在尝试将搜索功能合并到我的某个应用程序中,并且在解决显示多个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();
    }
}
}

1 个答案:

答案 0 :(得分:1)

您似乎以两种不同的方式双重实施搜索界面。如果你看一下official docs on setting up a search interface in the action bar,你会注意到它没有提到在onOptionsItemSelected中调用startSearch。尝试从onOptionsItemSelected中删除它,看看会发生什么。

编辑:经过进一步的研究,看起来你可能已经尝试过实现两个概述here的实现,但只有一个或另一个是必要的(尽管一个只适用于Honeycomb及以上,除非你使用ABS或AppCompat)。