- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试更改位于 Android 操作栏搜索 View 小部件中的可绘制对象。
目前它看起来像这样:
但我需要将可绘制的蓝色背景更改为红色。
除了滚动我自己的搜索小部件之外,我已经尝试了很多东西,但似乎没有任何效果。
有人可以指出我改变这一点的正确方向吗?
最佳答案
介绍
不幸的是,无法设置 SearchView
使用 XML 中的主题、样式和继承的文本字段样式 can do with background of items in ActionBar dropdown .这是因为 selectableItemBackground
is listed as styleable在 R.stylable
, 而 searchViewTextField
(我们感兴趣的主题属性)不是。因此,我们无法从 XML 资源中轻松访问它(您将收到 No resource found that matches the given name: attr 'android:searchViewTextField'
错误)。
从代码设置 SearchView 文本字段背景
所以,正确替换SearchView
背景的唯一方法文本字段是进入它的内部,获取对基于 searchViewTextField
背景设置的 View 的访问权限并设置我们自己的。
注意:下面的解决方案仅取决于 android:id/search_plate
中元素的 id ( SearchView
) ,所以它比 child 遍历更独立于 SDK 版本(例如,使用 searchView.getChildAt(0)
在 SearchView
内获得正确的 View ),但它不是防弹的。特别是如果某些制造商决定重新实现 SearchView
的内部结构并且不存在具有上述 id 的元素 - 代码将不起作用。
SDK中SearchView
中的文本框背景通过 nine-patches 声明,所以我们会这样做。您可以在 drawable-mdpi 中找到原始 png 图像Android git repository的目录.我们对两张图片感兴趣。一种用于选择文本字段时的状态(名为 textfield_search_selected_holo_light.9.png ),另一种用于未选择的状态(名为 textfield_search_default_holo_light.9.png )。
不幸的是,即使您只想自定义聚焦状态,您也必须创建两个图像的本地副本。这是因为 textfield_search_default_holo_light
不存在于 R.drawable .因此它不容易通过 @android:drawable/textfield_search_default_holo_light
访问。 ,可以在下面显示的选择器中使用,而不是引用本地可绘制对象。
注意:我使用 Holo Light 主题作为基础,但你可以用 Holo Dark 做同样的事情。似乎 Light 之间的选定状态 9-patch 没有真正的区别。和 Dark主题。但是,默认状态的 9 个补丁存在差异(请参阅 Light 与 Dark )。因此,对于深色和浅色主题,可能没有必要为选定状态制作 9 个补丁的本地副本(假设您想同时处理两者,并使它们看起来与 Holo 主题中的相同)。只需制作一份本地副本并在两个主题的可绘制选择器中使用它。
现在,您需要根据需要编辑下载的 9-patch (即将蓝色更改为红色)。您可以使用 draw 9-patch tool 查看文件在编辑后检查它是否正确定义。
我使用 GIMP 编辑过文件使用一像素铅笔工具(非常简单),但您可能会使用自己的工具。这是我为聚焦状态定制的 9-patch:
注意:为简单起见,我仅使用了 mdpi 密度的图像。如果您想在任何设备上获得最佳效果,您就必须为多个屏幕密度创建 9 个补丁。全息图像 SearchView
可以在 mdpi 中找到, hdpi和 xhdpi可绘制。
现在,我们需要创建可绘制的选择器,以便根据 View 状态显示正确的图像。创建文件 res/drawable/texfield_searchview_holo_light.xml
具有以下内容:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"
android:drawable="@drawable/textfield_search_selected_holo_light" />
<item android:drawable="@drawable/textfield_search_default_holo_light" />
</selector>
LinearLayout
设置背景包含文本字段的 View
SearchView
- 它的 ID 是
android:id/search_plate
.因此,以下是在创建选项菜单时如何在代码中快速执行此操作的方法:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
// Getting SearchView from XML layout by id defined there - my_search_view in this case
SearchView searchView = (SearchView) menu.findItem(R.id.my_search_view).getActionView();
// Getting id for 'search_plate' - the id is part of generate R file,
// so we have to get id on runtime.
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
// Getting the 'search_plate' LinearLayout.
View searchPlate = searchView.findViewById(searchPlateId);
// Setting background of 'search_plate' to earlier defined drawable.
searchPlate.setBackgroundResource(R.drawable.textfield_searchview_holo_light);
return super.onCreateOptionsMenu(menu);
}
}
SearchView
布局看起来像。在
SearchView contructor人们可以找到一条使布局膨胀的行:
inflater.inflate(R.layout.search_view, this, true);
SearchView
布局在名为
res/layout/search_view.xml
的文件中.调查
search_view.xml我们可以找到一个内部
LinearLayout
具有
search_plate
的元素(id
android.widget.SearchView$SearchAutoComplete
)在它里面(看起来像我们的搜索 View 文本字段):
<LinearLayout
android:id="@+id/search_plate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:background="?android:attr/searchViewTextField">
searchViewTextField
设置背景。属性。
searchViewTextField
属性设置,我们调查
res/values/themes.xml .有一组与
SearchView
相关的属性默认
Theme
:
<style name="Theme">
<!-- (...other attributes present here...) -->
<!-- SearchView attributes -->
<item name="searchDropdownBackground">@android:drawable/spinner_dropdown_background</item>
<item name="searchViewTextField">@drawable/textfield_searchview_holo_dark</item>
<item name="searchViewTextFieldRight">@drawable/textfield_searchview_right_holo_dark</item>
<item name="searchViewCloseIcon">@android:drawable/ic_clear</item>
<item name="searchViewSearchIcon">@android:drawable/ic_search</item>
<item name="searchViewGoIcon">@android:drawable/ic_go</item>
<item name="searchViewVoiceIcon">@android:drawable/ic_voice_search</item>
<item name="searchViewEditQuery">@android:drawable/ic_commit_search_api_holo_dark</item>
<item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
@drawable/textfield_searchview_holo_dark
.对于
Theme.Light
值(value)
is also set in that file .
searchViewTextField
出现在
R.attr
(和
R.stylable
)我们可以在用 XML 为整个应用程序定义主题时简单地使用我们的可绘制选择器。例如:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="android:Theme.Light">
<item name="android:searchViewTextField">@drawable/textfield_searchview_holo_light</item>
</style>
</resources>
search_plate
通过代码。但是,我们仍然不知道它应该是什么样子。简而言之,我们搜索用作默认主题值的可绘制对象:
textfield_searchview_holo_dark.xml和
textfield_searchview_holo_light.xml .查看内容,我们看到可绘制对象是
selector
根据 View 状态引用其他两个可绘制对象(稍后出现 9 个补丁)。您可以在
androiddrawables.com 上找到(几乎)所有 Android 版本的聚合 9-patch drawable。
关于android - 更改 searchview 小部件的背景可绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11085308/
我的 Activity 的主要内容区域中有一个 SearchView。 我需要覆盖我的 style.xml 文件中的 SearchView 样式(这样我就可以删除 SearchView 的下划线 -
我正在使用 Firebase-UI 的 FirebaseRecyclerAdapter。我无法在 SearchView 中实现过滤器。 我的数据库: 我的问题: 如何使用 FirebaseRecycl
我正在尝试以编程方式删除 SearchView 提示中的图标所占用的空间,但由于某种原因它不会消失。 此代码使图标不可见,但不会删除空格: try { Field mDrawa
我想在用户未输入任何内容时在 SearchView 中显示一些默认建议。我正在使用矩阵光标手动设置我的自定义建议适配器。我尝试在 onFocusChange 和 onClickListner 中设置适
如何删除或更改编辑文本中的搜索 View 图标?我正在使用 Appcompat 库。 我使用下面的代码修改和删除但它不起作用: SearchManager searchManager = (Searc
当我启动我的应用程序时,会引发以下错误: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.app, PID: 5513 jav
在我的应用程序中使用 SearchView。 无论如何我可以延迟对 onQueryTextChange() 方法的调用。例如,当用户键入一系列字符时,他必须等待此方法被调用。 此等待应该不取决于键入的
我正在尝试从 Fragment 中的工具栏获取我的 SearchView。 我在 onCreateOptionsMenu 中引入了一个菜单项。 问题:searchItem.getActionView(
我不确定为什么会收到此错误。这是有问题的菜单: 这是根据 developer guide 的可搜索配置. 添加到我的 list 文件中: 我在新的搜索 Activity 中也有一个
我是一名开发 Android 应用程序的新手,以下是该应用程序的第一个屏幕。我希望我的应用程序使用该搜索对话框执行搜索。 为此,我关注了http://developer.android.com/gui
我正在 CustomAdapter 上执行 SearchView,它将在其中搜索门名称。在我尝试运行该应用程序后,它突然崩溃并给我如上所述的错误。我不知道我什至做错了哪一部分导致我每次尝试运行我的应用
您好,我需要在 searchView 中放置一些文本并聚焦/展开 searchView 小部件。 这是我尝试过的,但它不起作用 @Override public boolean onCreateOpt
所以当我遇到错误“无法解析类 SearchView”时,我试图在我的应用程序中包含一个搜索栏。谷歌没有帮助,所以我来到这里。这是我的代码: 其余的 xml 已正确完成,我直接从 android 获取
我的搜索 View 有问题。 我有 2 个主题,当我第一次接触 searchview 时,我得到了丑陋的第一张图片。但是当我再次进入搜索 View 时,我从第二张图片中得到了很好的主题。 我总是想走第
我使用的不是 menuItem 而是布局中的搜索 View 。我支持的最低 API 级别是 9,搜索 View 是 11。 现在我这样创建了我的搜索 View : 在直线布局中。我注意到警告,所以
我在 here 中解决了我的问题之后当我在搜索框中输入文本时,搜索过滤器仍然不起作用。 这是我的代码: package intikom.streammobile.Customer; import an
我正在创建类似于屏幕上的 Activity 。我在工具栏中阅读了许多关于 SearchView 的教程,并在我的 Activity 中实现了它并且它有效(上面的代码)。但是如何制作这个下拉列表呢?感谢
我按照 Android 的官方说明在工具栏中实现了 SearchView。 SearchView 本身工作得很好,但是当我点击搜索图标时,它会向左移动,而不是显示搜索提示和关闭按钮,尽管如果我单击这个
Android Studio 3.2.1 在我的app / build.gradle中: android { compileSdkVersion 28 defaultConfig {
我有一个 RecylerView,它有 SearchView 小部件和包含复选框和玩家名称的项目列表。当我滚动项目并选择项目复选框时没有问题。但是,当我通过名称搜索项目然后选择它们时,就会出现问题,当
我是一名优秀的程序员,十分优秀!