首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Toolbar+SearchView+textSelection =文本选择条的坏位置

Toolbar+SearchView+textSelection =文本选择条的坏位置
EN

Stack Overflow用户
提问于 2015-05-14 21:22:29
回答 1查看 2.1K关注 0票数 3

背景

我正在尝试主题my app以获得更多的材料设计外观,因此,我有一个工具栏,它被设置为活动的actionBar。

我在其中有一个SearchView,允许搜索下面的listView项。

问题所在

问题是,您可以在SearchView中选择文本(要复制、剪切等.),但是当发生这种情况时,工具栏将文本选择工具栏放在上面,使其和文本本身隐藏起来:

文本选择之前:

文本选择后:

我试过的

我试图使用以下代码禁用文本选择:

代码语言:javascript
复制
  final EditText searchTextView=(EditText)searchView.findViewById(R.id.search_src_text);
  if(searchTextView!=null&&VERSION.SDK_INT>=VERSION_CODES.HONEYCOMB)
    searchTextView.setTextIsSelectable(false);

但它什么也没做。我还试图搜索如何侦听文本选择的偶数(这样我就可以将工具栏设置为marginTop或其他东西),但我没有找到它。

我唯一成功的地方是使用这段代码,它告诉我文本选择工具栏何时出现(但不会在它消失时出现):

代码语言:javascript
复制
  searchTextView.setOnCreateContextMenuListener(new OnCreateContextMenuListener()
  {
  @Override
  public void onCreateContextMenu(final ContextMenu menu,final View v,final ContextMenuInfo menuInfo)
    {
    Log.d("AppLog","onCreateContextMenu");
    }
  });

这没什么用。我连菜单都关不上。我认为这一点也帮不上忙,因为有些设备可能会显示其他东西,而不是工具栏(比如LG设备上,它们有一个小的弹出窗口)。

密码

布局基本上是一个垂直的LinearLayout,其中第一个项是工具栏:

代码语言:javascript
复制
<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_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

  <android.support.v7.widget.Toolbar
    android:id="@+id/activity_app_list__toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:colorControlNormal="?attr/colorControlNormal"
    android:minHeight="?attr/actionBarSize"
    android:theme="?attr/actionBarTheme"
    tools:ignore="UnusedAttribute"/>
  ...

使用的主题设置为隐藏正常操作栏:

代码语言:javascript
复制
  <style name="AppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
  ...

操作栏菜单的XML非常基本,有3个操作项,其中第一个是searchView:

代码语言:javascript
复制
<item
    android:id="@+id/menuItem_search"
    android:icon="?attr/app_search_menu_icon"
    android:title="@string/search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView"/>

SearchView的处理是通过我制作的一个特殊类完成的,这个类甚至支持旧的安卓版本。这是处理searchView的主要函数:

代码语言:javascript
复制
  @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
  public void init(final MenuItem searchMenuItem,final int hintResId,final OnQueryTextListener onQueryTextListener,final OnActionExpandListener onActionExpandListener)
    {
    this._searchMenuItem=searchMenuItem;
    if(_searchView==null)
      {
      _searchView=(SearchView)MenuItemCompat.getActionView(searchMenuItem);
      if(_searchView==null)
        {
        MenuItemCompat.setShowAsAction(searchMenuItem,MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW|MenuItem.SHOW_AS_ACTION_ALWAYS);
        MenuItemCompat.setActionView(searchMenuItem,_searchView=new SearchView(_context));
        }
      _searchView.setQueryHint(_context.getString(hintResId));
      if(VERSION.SDK_INT<VERSION_CODES.HONEYCOMB)
        {
        final EditText searchTextView=(EditText)_searchView.findViewById(R.id.search_src_text);
        if(searchTextView!=null)
          {
          searchTextView.setScroller(new Scroller(_context));
          searchTextView.setMaxLines(1);
          searchTextView.setVerticalScrollBarEnabled(true);
          searchTextView.setMovementMethod(new ScrollingMovementMethod());
          final int searchTextColorResId=App.getResIdFromAttribute(_context,android.R.attr.textColorPrimary);
          if(searchTextColorResId!=0)
            searchTextView.setTextColor(_context.getResources().getColor(searchTextColorResId));
          else
            {
            // TODO workaround for some v2.3 devices that can't get the correct color. remove this when stopping the support for v2.3
            TextView searchBadge=(TextView)_searchView.findViewById(R.id.search_badge);
            if(searchBadge!=null)
              searchTextView.setTextColor(searchBadge.getTextColors());
            }
          }
        }
      _searchView.setOnQueryTextListener(onQueryTextListener);
      MenuItemCompat.setOnActionExpandListener(searchMenuItem,onActionExpandListener);
      }
    }

该函数在任何活动/片段的"onCreateOptionsMenu“结尾处调用,例如:

代码语言:javascript
复制
    _searchHolder.init(menu.findItem(R.id.menuItem_search),R.string.search_for_apps,onQueryTextListener,onActionExpandListener);

问题是

我怎样才能解决这个问题?显然,这是因为工具栏只是一个视图,所以文本选择栏显示在它的上面,但是有什么方法可以解决这个问题吗?

如何避免在我使用过的工具栏之上添加额外的工具栏?

是否有办法支持这方面的所有设备?

从谷歌的应用程序来看,它们似乎通常不使用官方的searchView,而是使用自己的应用程序。只有在Youtube上,它看起来像是正式的actionBar,但在那里,他们似乎也使用了官方的(另外,在选择文本时,它有奇怪的颜色)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 12:38:43

我发现在许多应用程序(谷歌信使,联系人等)文本选择是禁用的搜索视图。您可以通过将工具栏主题设置为。

代码语言:javascript
复制
<style name="toolbarTheme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
        <item name="android:autoCompleteTextViewStyle">@style/SearchViewStyle</item>
        <item name="android:textColor">@android:color/white</item>
        <item name="android:textColorPrimary">@android:color/white</item>
        <item name="android:editTextColor">@android:color/white</item>        
</style>

<style name="SearchViewStyle" parent="@android:style/Widget.Holo.Light.AutoCompleteTextView">
        <item name="android:longClickable">false</item>
</style>

或者,如果你想要像youtube一样,在你的主题中添加这一行

代码语言:javascript
复制
<item name="windowActionModeOverlay">false</item>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30247580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档