如何将SearchView的搜索图标移动到右侧?

31

enter image description here

这是我的布局,使用了 android.support.v7.widget.SearchView。我想把搜索图标移到右侧,但是我没有找到任何方法...

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways|snap"
        app:popupTheme="@style/AppTheme.PopupOverlay">

        <android.support.v7.widget.SearchView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </android.support.v7.widget.Toolbar>

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_main_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>

`

我点击图标后,它将变成以下布局 在此输入图片描述
9个回答

30

您可以尝试使用layoutdirection属性,将其设置为"rtl"。

在搜索视图的XML中添加android:layoutDirection="rtl":

<SearchView android:layoutDirection="rtl"/>

<android.support.v7.widget.SearchView
                        android:id="@+id/searchView"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:layout_marginRight="11.4dp"
                        app:iconifiedByDefault="true"
                        android:animateLayoutChanges="true"
                        app:queryHint="@string/search_hint"
                        app:queryBackground="@android:color/transparent"
                        app:searchHintIcon="@drawable/empty_drawable"
                        app:closeIcon="@drawable/close_x_icon"
                        **android:layoutDirection="rtl"**
                        app:searchIcon="@drawable/magnifying_glass"
                        />
不要忘记将此项添加到您的清单应用标签中:
 android:supportsRtl="true"

我正在寻找完美的答案。谢谢。 - Jarin Rocks
1
很棒的答案,甚至不需要添加应用标签也能正常工作! - suv

21

您可以通过编程实现它。

SearchView search = (SearchView) item.getActionView();
    search.setLayoutParams(new ActionBar.LayoutParams(Gravity.RIGHT)); 

5
谢谢你的回复,但它没有起作用。 它触发了这个异常: ClassCastException: android.app.ActionBar$LayoutParams无法转换为android.support.constraint.ConstraintLayout $LayoutParams - Antoine Draune
这是工具栏,不是操作栏: SearchView search = (SearchView) item.getActionView(); search.setLayoutParams(new Toolbar.LayoutParams(Gravity.RIGHT)); - Miha Markic

15

您可以在menu.xml中添加以下内容来添加搜索操作:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <item
        android:id="@+id/action_search"
        android:icon="@mipmap/ic_search_white_24dp"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView" />
    <item android:id="@+id/action_download"
        android:title="@string/menu_action_download"
        android:icon="@mipmap/ic_file_download_white_24dp"
        android:orderInCategory="100"
        app:showAsAction="always" />
</menu>

正常外观 折叠外观


9
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:layout_scrollFlags="scroll|enterAlways|snap"
    app:popupTheme="@style/AppTheme.PopupOverlay">

    <RelativeLayout
       android:id="@+id/not"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
                        >
    <android.support.v7.widget.SearchView
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>
</android.support.v7.widget.Toolbar>

<android.support.design.widget.TabLayout
    android:id="@+id/tab_main_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>

5

android:layoutDirection="rtl" 对我很有用。


3

如果您想在ActionBar以外的任何其他视图(比如说ConstraintLayout)中使用SearchView,您可以使用这个网站上发布的方法。基本上,图标是在一个ImageView中定位在布局的开头(或者我可以说"它是添加到其父元素的第一个元素")。使用此代码,您可以搜索它,然后从父元素中移除它,最后将它放回。结果:它将被定位在SearchView小部件的"末尾"...问题解决了...

//Get ImageView of icon
ImageView searchViewIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);

//Get parent of gathered icon
ViewGroup linearLayoutSearchView = (ViewGroup) searchViewIcon.getParent();
//Remove it from the left...
linearLayoutSearchView.removeView(searchViewIcon);
//then put it back (to the right by default)
linearLayoutSearchView.addView(searchViewIcon);

测试通过,工作正常,满意... ;)


2

SearchView的重力通过xml或编程方式设置为右侧是有效的,但当SearchView展开后,它占用的右侧区域很小,这不是我想要的外观,我希望它占据整个宽度。

注意1:此解决方案不允许显示标题,因此我添加了一个TextView来容纳标题。

注意2:当SearchView展开时,它会覆盖自定义标题,因此我将SearchView背景设置为工具栏,以避免使用SearchView的展开/折叠功能时不断隐藏/显示标题。

以下是Toolbar代码:

  <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize">

            <TextView
                android:id="@+id/toolbar_title"
                style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:text="Toolbar Title"
                android:textColor="@android:color/white" />

            <android.support.v7.widget.SearchView
                android:id="@+id/search_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:background="?attr/colorPrimary"
                android:gravity="right" />
        </RelativeLayout>
    </android.support.v7.widget.Toolbar>

在这个活动中,我使用了Close和SearchClick监听器来将SearchView对齐到左侧。

    mSearchView = findViewById(R.id.search_view);

    mSearchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams) mSearchView.getLayoutParams();
            param.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
            //set layout params to cause layout update
            mSearchView.setLayoutParams(param);
            return false;
        }
    });
    mSearchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams) mSearchView.getLayoutParams();
            param.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
            //set layout params to cause layout update
            mSearchView.setLayoutParams(param);
        }
    });

2
也许已经太晚了,但这对我很有效,你可以从所附的截图中看到。
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:layout_constraintBottom_toTopOf="@+id/relativeLayout"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:title="Contacts">

    <android.support.v7.widget.SearchView
        android:id="@+id/searchView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:gravity="center_vertical"
        app:queryHint="Search" />

</android.support.v7.widget.Toolbar>

由于某些原因,这对我没有起作用。最终,我采用了包含具有属性“app:actionViewClass”的菜单项的方法。 - Xam

1
尝试这样做...它看起来与你预期的一样。只需在SearchView标签内添加此行即可。
android:gravity="right"

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:layout_scrollFlags="scroll|enterAlways|snap"
    app:popupTheme="@style/AppTheme.PopupOverlay">

    <android.support.v7.widget.SearchView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="right" />
</android.support.v7.widget.Toolbar>

<android.support.design.widget.TabLayout
    android:id="@+id/tab_main_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />


请发布您的完整代码,因为我测试了您的片段并已经工作正常。 - Parama Sudha

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