如何在ActionBar的右侧保留扩展的SearchView(使用自定义图标时)?

时间:2013-11-21 14:10:19

标签: android android-layout android-actionbar android-4.0-ice-cream-sandwich searchview

我的问题与SearchView wrong alignmentSearchView positions when expanded in ActionBar密切相关,但那里发布的答案无效。

所以,我在SearchView中使用Action Bar

<item android:id="@+id/action_search"
    android:icon="@drawable/navi_search"
    android:title="@string/action_search"
    android:showAsAction="ifRoom|collapseActionView"
    android:actionViewClass="android.widget.SearchView"
   />

默认情况下看起来像这样(右上角,溢出菜单旁边):

enter image description here

问题是,展开后,我希望SearchView保持在右侧,相反,它会移动到主页按钮(应用程序图标)旁边的左边缘。

我尝试将showAsAction更改为其中任何一个(as suggested here):

android:showAsAction="ifRoom"
android:showAsAction="always"

...这会在展开时修复对齐方式,但在处于折叠状态时自定义图标会丢失

enter image description here

此外,菜单android:layout_alignParentRight="true"上的android:layout_centerInParent="true"<item>等内容无效。

有什么想法吗?

我的目标是Android 4.0及更高版本:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />

3 个答案:

答案 0 :(得分:8)

好吧,我找到了办法:

onCreateOptionsMenu()中,在标准菜单膨胀之后,设置 Gravity.RIGHT实例的ActionBar.LayoutParams SearchView

@Override
public boolean onCreateOptionsMenu(Menu menu) {        
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);

    // ...

    // Find the SearchView; make it aligned to right, also in expanded mode:
    MenuItem item = menu.findItem(R.id.action_search);
    SearchView search = (SearchView) item.getActionView();
    search.setLayoutParams(new ActionBar.LayoutParams(Gravity.RIGHT));
}

(在菜单定义XML中,我仍然使用android:showAsAction="ifRoom|collapseActionView"。)

现在,SearchView会在右侧,图标所在的同一位置打开,并且自定义图标仍在使用中。

答案 1 :(得分:2)

尝试编辑此行

android:showAsAction="ifRoom|collapseActionView"

为:

android:showAsAction="ifRoom"

它会将编辑文本对齐到右边。

答案 2 :(得分:0)

使用此方法对我有用:

final SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setOnSearchClickListener(new View.OnClickListener()
{
     @Override
     public void onClick(View v)
     {
         searchView.setLayoutParams(new Toolbar.LayoutParams(Gravity.END));
     }
});