【问题标题】:Android Actionbar SearchView change icon and remove extra spacingAndroid Actionbar SearchView 更改图标并移除额外间距
【发布时间】:2016-10-19 07:15:04
【问题描述】:

我正在实施 SearchView。我已成功添加搜索视图及其所有功能。现在我想让它看起来很棒。

我需要进行两项更改,但我尝试了所有方法,但没有任何效果:

  1. 我想更改搜索图标。
  2. 我想删除 searchView 左侧的多余间距。

这是我的 searchView 目前的样子:

这就是我想做的

菜单/menu_search_action.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"
tools:context=".MainActivity">

<item
    android:id="@+id/action_search"
    android:icon="@drawable/location_icon"
    android:orderInCategory="100"
    android:title="@string/action_search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView" />

SearchCategoriesActivity.java

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_search_action, menu);


    MenuItem searchItem = menu.findItem(R.id.action_search);
    searchItem.expandActionView();
    MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {

            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {

            //DO SOMETHING WHEN THE SEARCHVIEW IS CLOSING
            back();
            return false;
        }
    });

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) MenuItemCompat
            .getActionView(searchItem);
    if (searchView != null) {
        searchView.setSearchableInfo(searchManager
                .getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        callSearch(query);
                        return true;
                    }

                    @Override
                    public boolean onQueryTextChange(String newText) {
                        callSearch(newText);
                        return true;
                    }
                });
    }

    for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
        textView.setTextColor(Color.WHITE);
    }
    return super.onCreateOptionsMenu(menu);

}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            back();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onBackPressed() {
    back();
}

private void back() {
    finish();
}

public static <V extends View> Collection<V> findChildrenByClass(
        ViewGroup viewGroup, Class<V> clazz) {
    return gatherChildrenByClass(viewGroup, clazz, new ArrayList<V>());
}

private static <V extends View> Collection<V> gatherChildrenByClass(
        ViewGroup viewGroup, Class<V> clazz, Collection<V> childrenFound) {

    for (int i = 0; i < viewGroup.getChildCount(); i++) {
        final View child = viewGroup.getChildAt(i);
        if (clazz.isAssignableFrom(child.getClass())) {
            childrenFound.add((V) child);
        }
        if (child instanceof ViewGroup) {
            gatherChildrenByClass((ViewGroup) child, clazz, childrenFound);
        }
    }

    return childrenFound;
}

【问题讨论】:

    标签: android android-actionbar searchview


    【解决方案1】:

    添加一个单独的Theme 如下更改搜索图标。

    <style name="AppTheme.SearchView" parent="Widget.AppCompat.SearchView">
        <item name="searchIcon">@mipmap/ic_search_white</item>
        <item name="closeIcon">@mipmap/ic_clear_white</item>
    </style>
    

    在您的Base Theme

    <!-- Base application theme. -->
    <style name="MyMaterialTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    
        <item name="searchViewStyle">@style/AppTheme.SearchView</item>
    
    </style>
    

    【讨论】:

    • 效果很好!谢谢你。边距呢?如果您有任何东西可以解决这些边距问题,那就太好了。
    • 很高兴知道。我会看看我能做什么。
    【解决方案2】:

    navigationBackButton 和 SearchView 之间的多余空间可以通过添加来移除 app:contentInsetStartWithNavigation="0dp" 在您的工具栏中。

    <androidx.appcompat.widget.Toolbar 
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:contentInsetStartWithNavigation="0dp" />
    

    【讨论】:

      【解决方案3】:

      在 onCreateOptionsMenu() 中以编程方式将 MaxWidth 设置为 SearchView

      @override 
      public boolean onCreateOptionsMenu(Menu menu) {
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.menu_search, menu);
          SearchView searchView = (SearchView)menu.findItem(R.id.menu_search).getActionView();
          searchView.setMaxWidth(Integer.MAX_VALUE);
      

      对于使用 Kotlin 的人

      searchview.maxWidth = Integer.MAX_VALUE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-11
        • 2017-04-09
        • 1970-01-01
        • 2012-08-14
        • 2016-07-24
        • 2012-04-24
        • 1970-01-01
        • 2019-11-24
        相关资源
        最近更新 更多