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

7
我的问题与SearchView错位扩展时的SearchView位置有密切关系,但那里发布的答案不起作用。
因此,我在操作栏中使用SearchView
<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更改为以下任一选项(如此处建议的):
android:showAsAction="ifRoom"
android:showAsAction="always"

在展开时,这确实可以修复对齐问题,但是在折叠状态下,自定义图标将丢失

enter image description here

此外,像菜单中的 <item> 上的 android:layout_alignParentRight="true"android:layout_centerInParent="true" 这样的东西没有任何效果。
有什么想法吗?
我针对的是 Android 4.0 及以上版本:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
3个回答

8

好的,我找到了一种方法:

onCreateOptionsMenu() 中,在标准菜单填充代码之后,使用 Gravity.RIGHTSearchView 实例设置 ActionBar.LayoutParams

@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在右侧打开,与图标所在的位置相同,并且仍在使用自定义图标。

有人可能会认为在菜单XML中的SearchView <item>上设置android:gravity="right"也可以实现这一点,但至少在我的测试设备上并没有。 - Jonik
是的,它在Android 4.0+上运行良好。您是否在使用此方法时遇到异常?考虑提出一个新问题。 - Jonik

3

试着编辑这一行

android:showAsAction="ifRoom|collapseActionView"

to:

android:showAsAction="ifRoom"

它将把EditText对齐到右侧。


通过阅读整个问题,您会发现我已经尝试过那种方法。(虽然它解决了对齐问题,但某种程度上导致我的自定义图标丢失了。) - Jonik

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));
     }
});

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