【问题标题】:SearchView taking all the space in the new ActionBarCompatSearchView 占用了新 ActionBarCompat 中的所有空间
【发布时间】:2013-07-27 13:21:55
【问题描述】:

我从 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

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

更新:

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

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

【问题讨论】:

  • 老兄,很抱歉成为语法纳粹,但它是“Álbumes”
  • @LuisLavieri,这不是西班牙语,是葡萄牙语。
  • 我的错!哇,太像了。

标签: android actionbarsherlock android-actionbar android-actionbar-compat


【解决方案1】:

这绝对是一个关于 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 用户也会受到影响。

【讨论】:

  • 谢谢你!这绝对是“真实”ActionBar 中的错误,而不仅仅是 ActionBarCompat。
【解决方案2】:

您是否尝试过使用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>

【讨论】:

  • 感谢您的回答,但我的屏幕的独特用途是搜索,因此我希望 SearchView 始终可见。而且我的代码在 V7 之前就可以工作,问题出在 V7 上。在谷歌发布修复了这个错误的下一个版本之前,我只是想有一个解决这个错误的方法。
  • 我不明白。您不想在不搜索时访问其他图标吗?或者你想让它一直扩展?
  • 使用 ActionBarSherlock,即使 SearchView 展开,我也能够访问操作项。无论如何,将操作项放在首位,我可以通过 ActionBarCompat 看到它们。我现在的主要问题是ActionBarCompat 没有显示进度条。它与 ActionBarSherlock 正常显示。
  • 如果在执行查询后折叠它怎么办?进度条会发生什么变化?
  • 它会显示的。展开 SearchView 时会出现问题。但是,就我而言,我需要一直扩展 SearchView,因为该屏幕仅用于搜索。如果我有一些网络错误并且我想让用户选择重试,我只会显示其他操作项。
【解决方案3】:

删除线

searchView.setIconifiedByDefault(false);

或者你可以显式调用带有true作为参数的方法。

【讨论】:

  • 正如我之前所说,我希望我的 SearchView 始终可见。所以,你的解决方案行不通。
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
相关资源
最近更新 更多