在android工具栏中正确实现SearchView

PYP*_*YPL 7 android searchview android-toolbar

我在android工具栏中的searchview实现有问题.

  1. 空的空间填充太大了.
  2. 我不想隐藏其他操作,但这些操作与SearchView重叠.
  3. SearchView的下划线不可见

我如何解决上述问题?

在此输入图像描述

menu.xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_search"
        android:title="@string/car_num"
        android:icon="@drawable/ic_search_white_24dp"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always" />

    <item
        android:id="@+id/action_add_client"
        android:icon="@drawable/ic_account_multiple_plus"
        android:title="@string/action_add_client"
        app:showAsAction="always" />
</menu>
Run Code Online (Sandbox Code Playgroud)

分段

@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_fragment_reg_vehicles, menu);

    final MenuItem item = menu.findItem(R.id.action_search);
    searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setQueryHint("Search");
    searchView.setMaxWidth(Integer.MAX_VALUE);
    searchView.setIconifiedByDefault(false);
    searchView.setOnQueryTextListener(this);
    searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            setItemsVisibility(menu, item, true);
            return false;
        }
    });
    searchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setItemsVisibility(menu, item, false);
            searchView.requestFocus();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

fll*_*llo 5

关于您发布的代码,这是输出:

\n\n

默认情况下带有 SearchView AppCompat 的工具栏

\n\n

如您所见,有两个左边距:小部件的容器和放大图标。这就是为什么你有一个比另一个带有标题的窗口更大的空白空间。菜单项被推到工具栏之外,我认为,ActionView当它不是默认的 SearchView 时CollapseActionView,它会填充父级。

\n\n

从小部件的来源SearchView及其布局abc_search_view.xml来看,我尝试删除多余的边距并避免将其他项目推到工具栏之外。
\n但经过多次操作后,我的猜测是您必须使用自定义小部件和/或自定义布局。或者使用setIconifiedByDefault(true)它删除放大图标及其额外的边距,并使用动态计算的setMaxWidth(MAX_SIZE)位置...但它需要大量的工作而毫无结果。因此,使用自定义布局可能是解决方案。MAX_SIZEInteger.MAX_VALUE - (SIZE_OF_A_MENU_ITEM * NB_OF_MENU_ITEMS)

\n\n

但是,有一种可能的方法来保留 appcompat widget,一些小解决方法。首先,为了避免推出其他项目,您可以使用CollapseActionView.

\n\n
<item\n    ...\n    app:actionViewClass="android.support.v7.widget.SearchView"\n    app:showAsAction="always|collapseActionView"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了维持您的要求,您必须在初始化时对其进行扩展:

\n\n
final SearchView searchView =\n            (SearchView) MenuItemCompat.getActionView(item);\nMenuItemCompat.expandActionView(item);\n
Run Code Online (Sandbox Code Playgroud)\n\n

setOnActionExpandListener()请注意,如果您不想折叠该项目,则必须使用来关闭窗口。这个建议会给你这个结果:

\n\n

扩展了 SearchView AppCompat 的工具栏

\n\n

还有额外的利润,对吗?因此,您必须通过其 id 检索容器和放大图标(您可以在abc_search_view.xml...中找到它们,但让我们节省一些时间:它们是R.id.search_edit_frameR.id.search_mag_icon)。您可以使用以下方法删除它们的边距:

\n\n
private void changeSearchViewElements(View view) {\n    if (view == null) \n        return;\n\n    if (view.getId() == R.id.search_edit_frame\n            || view.getId() == R.id.search_mag_icon) {\n        LinearLayout.LayoutParams p = \n                (LinearLayout.LayoutParams) view.getLayoutParams();\n        p.leftMargin = 0; // set no left margin\n        view.setLayoutParams(p);\n    }\n\n    if (view instanceof ViewGroup) {\n        ViewGroup viewGroup = (ViewGroup) view;\n        for (int i = 0; i < viewGroup.getChildCount(); i++) {\n            changeSearchViewElements(viewGroup.getChildAt(i));\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过在线程中调用它:

\n\n
final SearchView searchView =\n            (SearchView) MenuItemCompat.getActionView(item);\n...\nsearchView.post(new Runnable() {\n        @Override\n        public void run() {\n            changeSearchViewElements(searchView);\n        }\n    });\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是输出:

\n\n

带有 SearchView AppCompat 且没有左边距的工具栏

\n\n

最后,为了获得字段下方的线,有一个可能的解决方法,即使用 9-patch 可绘制对象并将其设置为背景。您可以在 Google 上轻松找到操作方法。所以条件将是:

\n\n
private void changeSearchViewElements(View view) {\n    ...\n    if (view.getId() == R.id.search_edit_frame\n            || view.getId() == R.id.search_mag_icon) {\n        LinearLayout.LayoutParams p = \n                (LinearLayout.LayoutParams) view.getLayoutParams();\n        p.leftMargin = 0; // set no left margin\n        view.setLayoutParams(p);\n\n    } else if (view.getId() == R.id.search_src_text) {\n        AutoCompleteTextView searchEdit = (AutoCompleteTextView) view;\n        searchEdit.setBackgroundResource(R.drawable.rect_underline_white);\n    }\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

从下面OP的评论来看,下划线的字段也可以用以下语句完成:

\n\n
searchView.findViewById(android.support.v7.appcompat.R.id.se\xe2\x80\x8c\xe2\x80\x8barch_src_text)\n        .setBa\xe2\x80\x8c\xe2\x80\x8bckgroundResource(R.d\xe2\x80\x8c\xe2\x80\x8brawable.abc_textfiel\xe2\x80\x8c\xe2\x80\x8bd_search_default_mtr\xe2\x80\x8c\xe2\x80\x8bl_alpha);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

正如我所说,在这些解决方法之后,使用自定义布局可能会更容易。但如果您想保留默认的 SearchView 小部件,这可能会有所帮助。

\n