【问题标题】:How to move SearchView 's search Icon to the right side?如何将 SearchView 的搜索图标移动到右侧?
【发布时间】:2016-04-28 04:05:05
【问题描述】:

这是我的布局,使用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>

`

单击图标后,它将变为此布局

【问题讨论】:

    标签: android android-layout material-design searchview


    【解决方案1】:

    你可以试试layoutdirection。将其设置为“rtl”

    android:layoutDirection="rtl" 在您的 searchview xml 中:

    <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"
    

    【讨论】:

    • 我正在寻找完美的答案。谢谢。
    • 很好的答案,即使不添加应用程序标签也能正常工作!
    【解决方案2】:

    你可以通过编程来实现

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

    【讨论】:

    • 感谢您的回答,但它不起作用。它触发了这个异常:ClassCastException: android.app.ActionBar$LayoutParams cannot be cast to android.support.constraint.ConstraintLayout$LayoutParams
    • 是工具栏,不是动作栏:SearchView search = (SearchView) item.getActionView(); search.setLayoutParams(new Toolbar.LayoutParams(Gravity.RIGHT));
    【解决方案3】:

    您可以在 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>
    

    【讨论】:

      【解决方案4】:
      <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" 这对我有用。

        【讨论】:

          【解决方案6】:

          如果您想在任何其他视图中使用ActionBar 之外的SearchView(例如ConstraintLayout),您可以使用this 网站上发布的方法。基本上,图标位于布局开头的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);
          

          测试,工作,满意... ;)

          【讨论】:

            【解决方案7】:

            通过 xml 或以编程方式将 SearchView 重力设置到右侧,但是当 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);
                    }
                });
            

            【讨论】:

              【解决方案8】:

              答案可能为时已晚,但这对我有用,正如您从所附screenshot 中看到的那样。

              <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”属性的菜单项的方法。
              【解决方案9】:

              试试这个...它看起来和你期望的一样。只需在 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" />
              

              【讨论】:

              • 发布您的完整代码。因为我已经测试过你的 sn-ps。它成功了。
              猜你喜欢
              • 1970-01-01
              • 2018-05-02
              • 1970-01-01
              • 2018-03-25
              • 2023-03-26
              • 1970-01-01
              • 1970-01-01
              • 2014-12-01
              • 1970-01-01
              相关资源
              最近更新 更多