在android工具栏中正确实施SearchView

我在android工具栏中的searchview实现中遇到问题。

  • 空白填充太大。
  • 我不想隐藏其他操作,但这些操作与SearchView重叠。
  • 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>
    

    分段

    @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();
            }
        });
    }
    

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

    工具栏默认使用SearchView AppCompat

    正如你所看到的,有两个左边距:widget的容器​​和magnify图标。 这就是为什么你有一个比另一个带有标题的窗口更大的空白空间。 菜单项被推到工具栏的外面,我认为它是默认的SearchView ActionView当它不是一个CollapseActionView ,它会填充父项。

    SearchView小部件的源代码及其布局abc_search_view.xml中,我尝试删除额外的边距,并避免将其他项目推送到工具栏之外。
    但经过许多操作后,我猜测你必须使用自定义小部件和/或自定义布局。 或者使用setIconifiedByDefault(true)来移除magnify图标及其额外的边距,并使用setMaxWidth(MAX_SIZE) ,其中MAX_SIZE是通过Integer.MAX_VALUE - (SIZE_OF_A_MENU_ITEM * NB_OF_MENU_ITEMS)动态计算的Integer.MAX_VALUE - (SIZE_OF_A_MENU_ITEM * NB_OF_MENU_ITEMS) ...但它需要大量工作没有。 所以使用自定义布局可能是解决方案。

    但是, 有一种可能的方法来保留appcompat小部件 ,一些小的解决方法。 首先,为了避免排除其他项目,可以使用CollapseActionView

    <item
        ...
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always|collapseActionView"/>
    

    为了保持您的需求,您必须在初始化时扩展它:

    final SearchView searchView =
                (SearchView) MenuItemCompat.getActionView(item);
    MenuItemCompat.expandActionView(item);
    

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

    带有SearchView AppCompat的工具栏已展开

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

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

    通过在一个线程中调用它:

    final SearchView searchView =
                (SearchView) MenuItemCompat.getActionView(item);
    ...
    searchView.post(new Runnable() {
            @Override
            public void run() {
                changeSearchViewElements(searchView);
            }
        });
    

    这是输出:

    带有SearchView AppCompat的工具栏,不带左边距

    最后,为了获得该字段,可以使用9补丁绘图并将其设置为背景。 您可以在Google上轻松找到如何操作。 所以情况将是:

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

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

    searchView.findViewById(android.support.v7.appcompat.R.id.se‌​arch_src_text)
            .setBa‌​ckgroundResource(R.d‌​rawable.abc_textfiel‌​d_search_default_mtr‌​l_alpha);
    

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

    链接地址: http://www.djcxy.com/p/94483.html

    上一篇: Correct implementation of SearchView in android toolbar

    下一篇: Firebase to load more items on scroll (Android)