SearchView占用新ActionBarCompat中的所有空间

时间:2013-07-27 13:21:56

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

我从ActionBarSherlock切换到ActionBarCompat(支持库v7)。经过一些调整后,现在几乎所有东西都运转良好。

但是我在ActionBar中遇到了SearchView问题。当它被扩展时(实际上,它总是在我的Activity中扩展),它占用了所有空间并且不尊重设置为始终显示的其他Action Items的空间(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中的结果:

enter image description here

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

enter image description here

使用时会出现同样的问题:

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之前,这样就会出现这些项目。

enter image description here

但是,setSupportProgressBarIndeterminateVisibility(true)仍未显示进度条。

3 个答案:

答案 0 :(得分: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用户也受到影响。

答案 1 :(得分: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>

答案 2 :(得分:0)

删除行

searchView.setIconifiedByDefault(false);

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