【问题标题】:Android expanded SearchView makes other ActionBar items disappearAndroid扩展SearchView使其他ActionBar项消失
【发布时间】:2015-03-21 10:46:46
【问题描述】:

我在使用片段调用的上下文操作栏中的 SearchView 时遇到了一些问题。主要的是,当我的 SearchView 展开时,即使有一些未使用的空间,它也会使操作栏中的所有其他项目(关闭按钮除外)消失,就像您在此屏幕截图中看到的那样:

此外,我也遇到了这个问题中讨论的相同问题: ActionBar always expanded SearchView with the icon inside

这是我的 SearchView 的 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/menu_series_cab_search"
        android:icon="@drawable/ic_search"
        android:title="@string/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never" />
</menu>

这是我实现 ActionMode.Callback 的 Fragment 的 JAVA 代码

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    mode.getMenuInflater().inflate(R.menu.menu_series_cab, menu);
    mSearchView = (SearchView) MenuItemCompat
            .getActionView(menu.findItem(R.id.menu_series_cab_search));
    mSearchView.setQueryHint(getResources().getString(R.string.action_search));
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            mSearchView.clearFocus();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            return false;
        }
    });
    mSearchView.setIconifiedByDefault(false);
    return true;
}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    mSearchView.requestFocus();
    return true;
}

【问题讨论】:

    标签: android android-fragments searchview android-actionbar-compat contextual-action-bar


    【解决方案1】:

    首先,searchview 小部件有一个最大固定大小,因此空白空间是不可避免的。

    如果您希望“action_settings”项在 searchview 折叠时不会消失,您需要设置 app:showAsAction="always"

    <?xml version="1.0" encoding="utf-8"?>
    

    <item android:id="@+id/menu_series_cab_search"
        android:icon="@drawable/ic_search"
        android:title="@string/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/>
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
        app:showAsAction="always" />
    

    你的Java代码应该是这样的:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    
        inflater.inflate(R.menu.main, menu);
    
    
        MenuItem searchItem = menu.findItem(R.id.action_search);
        // Get the SearchView and set the searchable configuration
        searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) MenuItemCompat.getActionView(searchItem);//MenuItemCompat.getActionView(searchItem);//menu.findItem(R.id.action_search).getActionView();
        // Assumes current activity is the searchable activity
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
        searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
    
        super.onCreateOptionsMenu(menu, inflater);
    }
    

    【讨论】:

    • 嗨,布朗克斯,谢谢你的回答,但它不起作用。我尝试使用app:showAsAction="always" 并删除android:orderInCategory="100",但没有运气。
    • 嗨 Galaron,我已经更新了我的答案,搜索项错过了“collapseActionView”操作
    • 随着您更新的答案,我的其他操作可见,但不会显示为“溢出菜单”(三个点在另一个之上),更重要的是,我的搜索视图开始图标化并且不会即使我点击它也不会打开。对不起,如果我可能显得有些笨拙,但距离我上次为 Android 编写代码已经很长时间了。
    • 非常感谢 Bronx,主要问题现已解决。正如您所说,我已经更新了我的 Java 代码,并且在 XML 中我刚刚修改了第一项,设置为 app:showAsAction="ifRoom|collapseActionView"(没有触及第二项)。现在有一个我不喜欢的东西,为什么放大图标出现在文本字段之外?其余的我会 +1,但我没有足够的声誉,再次感谢。
    • 没问题 :),最后我希望这可以帮助nlopez.io/…
    【解决方案2】:

    感谢 Bronx 在他上一篇文章中发布的链接以及类似 Android - cannot find TextView inside SearchWidget when using Android Support library 的其他答案@(已接受的答案):为了在文本视图中移动放大图标,我从第一个 Bronx 答案中删除了这一行

    ,我正在完成这个答案 p>
    searchView.setIconifiedByDefault(false);
    

    然后我在 Bronx 的代码后面粘贴了这个:

        AutoCompleteTextView autoComplete = (AutoCompleteTextView)mSearchView.findViewById(R.id.search_src_text);
        Class<?> clazz = null;
        try {
            clazz = Class.forName("android.widget.SearchView$SearchAutoComplete");
            SpannableStringBuilder stopHint = new SpannableStringBuilder("  ");
            stopHint.append(getString(R.string.action_search));
            // Add the icon as an spannable
            Drawable searchIcon = getResources().getDrawable(R.drawable.abc_ic_search_api_mtrl_alpha);
            Method textSizeMethod = clazz.getMethod("getTextSize");
            Float rawTextSize = (Float)textSizeMethod.invoke(autoComplete);
            int textSize = (int) (rawTextSize * 1.25);
            searchIcon.setBounds(0, 0, textSize, textSize);
            stopHint.setSpan(new ImageSpan(searchIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            // Set the new hint text
            Method setHintMethod = clazz.getMethod("setHint", CharSequence.class);
            setHintMethod.invoke(autoComplete, stopHint);
        } catch (Exception e) {
            // Set default hint
            mSearchView.setQueryHint(getResources().getString(R.string.action_search));
            e.printStackTrace();
        }
    

    请注意R.string.action_search 指的是我项目中的自定义字符串,因此请使用您的进行更改。再次感谢布朗克斯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多