在操作栏中居中显示搜索视图

14

如何使一个ActionView(特别是一个SearchView)居中在一个操作栏(Action Bar)中?

如同在Google图书应用中看到的:

  Google Books app SearchView

我当前的布局设置(search_layout.xml):

<?xml version="1.0" encoding="utf-8"?>
<SearchView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:queryHint="@string/search_hint" />

我的操作栏 XML 文件(menu.xml)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:icon="@+android:drawable/ic_menu_search"
        android:title="@string/search"
        android:showAsAction="always|collapseActionView"
        android:id="@+id/searchMenuItem"
        android:actionLayout="@layout/search_layout" />
</menu>

有没有一种方法可以模仿Books应用的SearchView行为?


你尝试过android:layout_gravity="center_horizontal"吗? - MillyMonster
嗯,奇怪。你使用的是什么布局? - MillyMonster
尝试使用 android:layout_centerHorizontal="true"。 - Usman Kurd
1
你可以尝试在代码中为SearchView设置ActionBar.LayoutParams,看看是否适用于你:https://dev59.com/c3nZa4cB1Zd3GeqPpmhi#20146626 - Jonik
2个回答

17

据我所知,无法使用xml menu中的Action Items实现在ActionBar中居中显示的View。但是可以通过为ActionBar设置自定义布局来实现。下面是一个基本示例:

Activity

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActionBar actionBar = getActionBar();
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setCustomView(R.layout.actionbar_layout);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

其中actionbar_layout是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <SearchView
        android:id="@+id/mySearchView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:iconifiedByDefault="false" />
</RelativeLayout>

在7英寸的平板电脑上创建以下内容:

enter image description here

请注意,在SearchView上设置了iconifiedByDefault属性为false,这将强制其展开而不仅仅是作为一个图标。这可能需要您通过编程方式隐藏软键盘,否则它会在 Activity 启动时打开。


我知道从我在问题中提供的图片上看不出来,但是Books应用程序中的SearchView默认情况下是被图标化的,然后在展开时在操作栏中居中。使用自定义视图可以实现这个吗? - Whymarrh
2
使用我回答中的布局,如果您从iconifiedByDefault=true开始,然后点击图标,它将在ActionBar中心对齐。但是我不知道您希望非展开图标的起始位置在哪里。尝试此示例,将iconifiedByDefault设置为true,看看是否符合您的要求。如果不是,例如,如果您希望图标从最右侧开始,然后在单击时向中心移动,因为它被展开了,您必须监听单击事件,并动态地将自定义布局的布局参数从alignParentRight设置为centerInParent。 - Gunnar Karlsson

-1

请看这里。您只需使用android:actionViewClass="android.widget.SearchView"属性即可,这应该可以正常工作(请记住,您可以在Java中引用searchView,并在那里更改提示,如果您想要的话)。


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