如何删除 Android searchview 左侧的空间(不是操作栏的一部分)?

Posted

技术标签:

【中文标题】如何删除 Android searchview 左侧的空间(不是操作栏的一部分)?【英文标题】:How to remove space on the left side of Android searchview (which is not part of actionbar)? 【发布时间】:2016-06-12 06:19:15 【问题描述】:

我在 android 应用中使用 searchview(searchview 不是操作栏的一部分)。我想删除搜索图标/搜索视图左侧的空间。我进行了很多搜索并收到了适用于作为操作栏一部分的搜索视图的答案。

我尝试使用 android:layout_gravity, android:gravity,但它们似乎不起作用。我想过使用 android:contentInsetStart, android:contentInsetLeft,但是这些选项不适用于 searchview(它不是操作栏的一部分)。

[http://postimg.org/image/xz6pf8yp5/][1]

(因为我的声望不到10,所以不能直接在这里发布图片)

serchview 是 LinearLayout(垂直方向)。这是我正在使用的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:layout_
    android:layout_
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <SearchView
        android:id="@+id/searchView1"
        android:layout_
        android:layout_
        android:paddingTop="2dp"
        android:layout_gravity="left"
        android:gravity="left"
        />

    <ListView
        android:id="@+id/listView1"
        android:layout_
        android:layout_
        android:background="@android:color/white" />

</LinearLayout>

【问题讨论】:

这个我有点晚了,但是如果你没有解决这个问题,请在下面查看我的答案。 【参考方案1】:

上面发布的图片链接不再有效,所以我假设这是我遇到的相同问题,如下图所示:

对此的快速而肮脏的答案是在您的 SearchView 上使用负左(/开始)填充,如下所示(注意:这是 AppCompat SearchView 删除了 searchIcon)。

<android.support.v7.widget.SearchView
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_
  android:layout_
  android:paddingLeft="-16dp"
  android:paddingStart="-16dp"
  app:iconifiedByDefault="false"
  app:searchIcon="@null"
  app:queryHint="Search"
  app:theme="@style/ThemeOverlay.AppCompat.Dark"
  />

或者使用 AppCompat SearchView,您可以使用 app:layout=R.layout.some_custom_layout 将自定义布局设置为在初始化期间膨胀,您可以在其中手动修改填充/边距。如果您打算采用这条路线,我建议您复制原始布局 (found here) 并仅修改您需要的值,请参见下面的示例:

<android.support.v7.widget.SearchView
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_
  android:layout_
  android:paddingLeft="-16dp"
  android:paddingStart="-16dp"
  app:iconifiedByDefault="false"
  app:searchIcon="@null"
  app:queryHint="Search"
  app:theme="@style/ThemeOverlay.AppCompat.Dark"
  app:layout="@layout/search_view"
  />

search_view.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
/*
 * Modified SearchView layout to remove 16dp left spacing from the input box.
 *
 * Original copyright notice:
 *
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/search_bar"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    >

  <!-- This is actually used for the badge icon *or* the badge label (or neither) -->
  <TextView
      android:id="@+id/search_badge"
      android:layout_
      android:layout_
      android:layout_marginBottom="2dip"
      android:drawablePadding="0dip"
      android:gravity="center_vertical"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:textColor="?android:attr/textColorPrimary"
      android:visibility="gone"
      />

  <ImageView
      android:id="@+id/search_button"
      android:layout_
      android:layout_
      android:layout_gravity="center_vertical"
      android:contentDescription="@string/abc_searchview_description_search"
      android:focusable="true"
      style="?attr/actionButtonStyle"
      />

  <LinearLayout
      android:id="@+id/search_edit_frame"
      android:layout_
      android:layout_
      android:layout_weight="1"
      android:layoutDirection="locale"
      android:orientation="horizontal"
      >

    <ImageView
        android:id="@+id/search_mag_icon"
        android:layout_
        android:layout_
        android:layout_gravity="center_vertical"
        android:scaleType="centerInside"
        android:visibility="gone"
        style="@style/RtlOverlay.Widget.AppCompat.SearchView.MagIcon"
        />

    <!-- Inner layout contains the app icon, button(s) and EditText -->
    <LinearLayout
        android:id="@+id/search_plate"
        android:layout_
        android:layout_
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:orientation="horizontal"
        >

      <view
          class="android.support.v7.widget.SearchView$SearchAutoComplete"
          android:id="@+id/search_src_text"
          android:layout_
          android:layout_
          android:layout_gravity="center_vertical"
          android:layout_weight="1"
          android:background="@null"
          android:dropDownAnchor="@id/search_edit_frame"
          android:dropDownHeight="wrap_content"
          android:dropDownHorizontalOffset="0dip"
          android:dropDownVerticalOffset="0dip"
          android:ellipsize="end"
          android:imeOptions="actionSearch"
          android:inputType="text|textAutoComplete|textNoSuggestions"
          android:singleLine="true"
          />

      <ImageView
          android:id="@+id/search_close_btn"
          android:layout_
          android:layout_
          android:layout_gravity="center_vertical"
          android:background="?attr/selectableItemBackgroundBorderless"
          android:contentDescription="@string/abc_searchview_description_clear"
          android:focusable="true"
          android:paddingLeft="8dip"
          android:paddingRight="8dip"
          />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/submit_area"
        android:layout_
        android:layout_
        android:orientation="horizontal"
        >

      <ImageView
          android:id="@+id/search_go_btn"
          android:layout_
          android:layout_
          android:layout_gravity="center_vertical"
          android:background="?attr/selectableItemBackgroundBorderless"
          android:contentDescription="@string/abc_searchview_description_submit"
          android:focusable="true"
          android:paddingLeft="16dip"
          android:paddingRight="16dip"
          android:visibility="gone"
          />

      <ImageView
          android:id="@+id/search_voice_btn"
          android:layout_
          android:layout_
          android:layout_gravity="center_vertical"
          android:background="?attr/selectableItemBackgroundBorderless"
          android:contentDescription="@string/abc_searchview_description_voice"
          android:focusable="true"
          android:paddingLeft="16dip"
          android:paddingRight="16dip"
          android:visibility="gone"
          />
    </LinearLayout>
  </LinearLayout>
</LinearLayout>

我个人只是最终使用了首先提到的快速而肮脏的方法,我只是想将其包括在内以保持完整性。

如果我错过了什么,请打我。

【讨论】:

【参考方案2】:
android:paddingStart="-16dp"

这对于棒棒糖后的设备来说已经足够了。

【讨论】:

当 searchview 在工具栏中并且填充为 8dp 时,这对我有用。所以我使用android:paddingStart="-8dp" 在我的情况下应该是 margin 而不是 padding android:layout_marginStart="-16dp"【参考方案3】:

只需使用您的SearchView 作为输入调用它,它就会清除所有插入。

private static void trimChildMargins(@NonNull ViewGroup vg) 
    final int childCount = vg.getChildCount();
    for (int i = 0; i < childCount; i++) 
        final View child = vg.getChildAt(i);

        if (child instanceof ViewGroup) 
            trimChildMargins((ViewGroup) child);
        

        final ViewGroup.LayoutParams lp = child.getLayoutParams();
        if (lp instanceof ViewGroup.MarginLayoutParams) 
            ((ViewGroup.MarginLayoutParams) lp).leftMargin = 0;
        
        child.setBackground(null);
        child.setPadding(0, 0, 0, 0);
    

【讨论】:

【参考方案4】:

以编程方式,您需要在 SearchView 中设置 EditText 的填充。

EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchEditText.setPadding(0, 2, 0, 2);

注意:将 top、bottom 和 right 的填充设置为您喜欢的值,但 leftPadding 为 0 应该强制编辑文本中的所有内容到 SearchView 的左侧

【讨论】:

【参考方案5】:

试试这个:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_
    android:layout_
    app:contentInsetEnd="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetRight="0dp"
    app:contentInsetStart="0dp">

    <SearchView
        android:id="@+id/search_view"
        android:layout_
        android:layout_
        android:iconifiedByDefault="false"
        android:queryHint="Search"
       />

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

【讨论】:

【参考方案6】:

嘿,在 onCreate 中为 SearchView 动态设置填充并尝试 SearchView sv = findViewById(R.id.searchView1); sv.setPadding(0,2,0,0);

【讨论】:

嘿,我尝试以编程方式设置填充,但它不起作用。我想searchview本身存在一些问题。我猜 EditText 在这种情况下会起作用。【参考方案7】:

尝试使用此代码一次

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_
    android:layout_
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">


    <SearchView
        android:layout_
        android:layout_
        android:id="@+id/searchView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
      />

    <TextView android:text="Hello World!" android:layout_
        android:layout_
        android:id="@+id/textView"
        android:layout_below="@id/searchView"/>

</RelativeLayout>

【讨论】:

这是否打算成为您先前答案的一部分?还是一个全新的答案?不要发布多个答案,除非他们提供不同的解决方案。 是的,和上一个答案不一样【参考方案8】:

如果从代码中添加了您的 SearchView,那么只需在 kotlin 中添加此代码:

var searchView = searchItem.actionView as SearchView
val searchEditFrame: LinearLayout =
searchView!!.findViewById<View>(R.id.search_edit_frame) as LinearLayout
val layoutParams: LinearLayout.LayoutParams =
searchEditFrame.layoutParams as LinearLayout.LayoutParams
layoutParams.leftMargin = -10

之前:

之后:

【讨论】:

以上是关于如何删除 Android searchview 左侧的空间(不是操作栏的一部分)?的主要内容,如果未能解决你的问题,请参考以下文章

Android SearchView 图标

如何更改 android SearchView 文本

如何在 Android SearchView 中关闭键盘?

如何在工具栏 Android 中使用 SearchView

如何在 Android 中展开的 SearchView(显示 10 个最近搜索)下方添加一个按钮(如“清除历史记录”)?

如何更改 SearchView 上的默认图标,以便在 Android 的操作栏中使用?