17

我从 ActionBarSherlock 切换到 ActionBarCompat(支持库 v7)。经过一些调整,现在几乎一切正常。

但是我在 ActionBar 中的 SearchView 遇到了麻烦。当它展开时(实际上,它总是在我的 Activity 中展开),它占用了所有空间,并且不尊重设置为始终显示的其他操作项的空间(showAsAction="always")。

要模拟问题,请使用以下命令:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/menu_buscar"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:icon="@drawable/abc_ic_search"
        app:showAsAction="always"
        android:title="@string/buscar"/>

    <item android:id="@+id/tentar_novamente"
          android:title="@string/tentar_novamente"
          android:icon="@drawable/acao_tentar_novamente"
          app:showAsAction="always" />

</menu>

在活动中:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.busca_action_menu, menu);

    searchMenuItem = menu.findItem(R.id.menu_buscar);
    searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);

    searchView.setIconifiedByDefault(false);
    searchView.setQueryHint(stringBusqueArtistasMusicasEAlbuns);

    return super.onCreateOptionsMenu(menu);
}

这是 android 4.3 中的结果:

在此处输入图像描述

这是 android 2.3 中的结果(甚至没有出现操作项):

在此处输入图像描述

当我使用时会发生同样的问题:

setSupportProgressBarIndeterminateVisibility(true);

进度指示器在Android 4.3 中显得很奇怪,在Android 2.3 中没有出现。

相同的代码在 ActionBarSherlock 中按预期工作。当有一些操作项时,SearchView 会减小其宽度以为操作项留出空间。

更新:

我在 Android 的 Bug Tracker 中发布了一个问题: https ://code.google.com/p/android/issues/detail?id=58251&thanks=58251&ts=1375191632

如果您有同样的问题,请关注问题。

更新:

我试图将操作项放在 SearchView 之前,这样它们就会出现。

在此处输入图像描述

但是, setSupportProgressBarIndeterminateVisibility(true) 仍然没有显示进度条。

4

3 回答 3

5

这绝对是一个关于 Android 的错误,但解决方法可以像这样以编程方式包含 SearchView:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());
    searchView.setIconifiedByDefault(false);
    getActionBar().setCustomView(searchView);
    getActionBar().setDisplayShowCustomEnabled(true);
}

您还可以使用布局 XML 来定义 SearchView 属性。然而,根据我的经验,XML 中的“iconifiedByDefault”往往无效。(虽然这可能是我的坏事)

感谢您为此提出问题。这是相关错误报告的 URL: https ://code.google.com/p/android/issues/detail?id=58251

尽管错误报告中提到了,但我对 ActionBarSherlock 和 ActionBarCompat 的体验是相同的。所以我预计 ActionBarSherlock 用户也会受到影响。

于 2014-01-07T22:51:17.143 回答
1

你试过使用collapseActionView()吗?

我这样使用它:

public static MenuItem msearchMenuItem;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, 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()));



    msearchMenuItem = menu.findItem(R.id.search);

    return true;
}
public static MenuItem getSearchMenuItem() {
    return msearchMenuItem;
}

public void doSomething(){
    //Collapse the SearchBar
    getSearchMenuItem().collapseActionView();
}

我不知道它是否适用于 v7,但它肯定适用于 v4。

尝试更改 android:showAsAction="collapseActionView|ifRoom"

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
      android:title="@string/search_title"
      android:icon="@drawable/ic_search"
      android:showAsAction="collapseActionView|ifRoom"
      android:actionViewClass="android.widget.SearchView" />
</menu>
于 2013-08-02T05:07:15.347 回答
0

删除线

searchView.setIconifiedByDefault(false);

或者您可以显式调用该方法true作为参数。

于 2013-09-09T06:28:01.317 回答