始终展开ActionBarSherlock SearchView

7

我需要让SearchView始终处于展开状态,并在ActionBar中再添加一个按钮,以便用户可以快速访问搜索活动中的搜索字符串。
我有这个活动的菜单布局:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_search"
        android:title="@string/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:actionViewClass="com.actionbarsherlock.widget.SearchView"/>
    <item android:id="@+id/action_configure"
        android:title="@string/action_configure"
        android:icon="@android:drawable/ic_menu_preferences"
        android:showAsAction="always" />
</menu>

在搜索活动类中,我按照以下方式配置ActionBar:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.search, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView)menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false);
    searchView.setSubmitButtonEnabled(false);
return true;
}

问题在于,如果我执行searchView.setIconifiedByDefault(false); ,我看到这张图片:
enter image description here
你可以注意到没有第二个菜单项。在这里,如果我设置android:showAsAction="always|collapseActionView",它默认会折叠,但是现在我可以看到第二个项目:
enter image description here
在上面的图片中,我已经按下了搜索图标

我无法解决两个问题:

  1. 如何始终显示两个元素:扩展的搜索视图和用于配置操作的图标?
  2. 如何摆脱这个丑陋的第二个搜索图标?

你找到解决方案了吗? - Giuseppe
不,我只是将SearchView替换为EditText,并将其他菜单项移出ActionBar。 - gorodechnyj
3个回答

3

以下是我对隐藏内部搜索图标的解决方案。

在您管理主题的styles.xml文件中,在application_theme部分(通常在base_theme下面),添加以下内容:

<!--Application Theme-->
<style name="application_theme" parent="application_base_theme">
    <item name="searchViewSearchIcon">@android:color/transparent</item>
    <item name="searchViewCloseIcon">@android:color/transparent</item>
</style>

这会强制将actionbar搜索小部件中搜索图标的所有出现变为透明和不可见。

它们仍然会占据文本字段中的空间,但在图标原来的左侧创建一个不可见的边距。如果您想解决此问题,必须使用自己的类扩展com.actionbarsherlock.widget.SearchView并添加以下内容:

ImageView searchHintIcon = (ImageView) findViewById(R.id.abs__search_mag_icon);
searchHintIcon.setVisibility(View.GONE);

我会把这个内容添加到构造函数中,并覆盖setIconified和setIconifiedByDefault方法,并在那里包含它。这将强制在展开操作视图时隐藏图标。
如果想要在操作栏中显示其他图标,请尝试设置:
android:showAsAction="collapseActionView|ifRoom"

这应该会导致搜索栏在操作栏有足够的空间时展开,而不是完全强制将其从操作栏中移除。
希望对你有所帮助。

谢谢。如果有机会的话,我会稍后使用它。 - gorodechnyj

3
我成功解决了这个问题,通过使用


mySearchView.setIconfied(false); 

而不是使用 setIconifiedByDefault()

附注:我正在使用 android.support.v7.widget.SearchView


现在我明白了,在这种情况下使用 HoloEverywhere 是不必要的。支持包变得更加功能强大了。 - gorodechnyj
这对我不起作用。总是显示这个丑陋的搜索视图图标... :( - Joan Casadellà

0
我的解决方法是为SearchView设置特定的宽度,以解决两个元素的显示问题。
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(350, FrameLayout.LayoutParams.WRAP_CONTENT);
searchView.setLayoutParams(lp);

我正在使用的代码是:

res/menu/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/search"
        android:actionViewClass="com.actionbarsherlock.widget.SearchView"
        android:showAsAction="always"
        android:title="@string/action_search"/>
    <item
        android:id="@+id/settings"
        android:showAsAction="ifRoom"
        android:onClick="startSettingsActivity"
        android:title="@string/action_settings"/>
</menu>

而在我的活动

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.main, menu);
    MenuItem searchViewItem = menu.findItem(R.id.search);
    SearchView searchView = (SearchView) searchViewItem.getActionView();
    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(350, FrameLayout.LayoutParams.WRAP_CONTENT);
    searchView.setLayoutParams(lp);

    searchView.setIconifiedByDefault(false);
    searchView.setSubmitButtonEnabled(false);

    return true;
}

public void startQuickSearchActivity(MenuItem menuItem){
    startActivity(new Intent(this, QuickSearchActivity_.class));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接