自定义SearchView字体后查询提示文字上移,如何实现垂直居中
问题现象

自定义Poppins字体后,SearchView的查询提示文字出现向上偏移,无法和左侧搜索图标垂直居中。
问题原因
自定义字体自带的默认上下留白、行高参数和系统默认字体不一致,导致SearchView内置的输入TextView(search_src_text)基线对齐异常,最终出现偏移。
解决方案
可任选以下一种方式修复:
方案1:Java代码动态调整(适配现有写法)
在原有设置字体的逻辑后新增对齐和边距调整代码即可:
Typeface tf = ResourcesCompat.getFont(getContext(),R.font.poppins); searchView = getActivity().findViewById(R.id.search_bar); searchText = (TextView)searchView.findViewById(androidx.appcompat.R.id.search_src_text); searchText.setTypeface(tf); // 新增以下调整代码 searchText.setGravity(Gravity.CENTER_VERTICAL); // 关闭系统默认字体留白,避免自定义字体排版偏移 searchText.setIncludeFontPadding(false); // 按需调整上下padding,文字上移就增加paddingTop数值,可在1~4dp之间测试适配 int topPadding = dp2px(getContext(), 2); searchText.setPadding(searchText.getPaddingLeft(), topPadding, searchText.getPaddingRight(), searchText.getPaddingBottom());
补充dp转px的工具方法:
private int dp2px(Context context, float dpVal) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, context.getResources().getDisplayMetrics()); }
方案2:XML样式配置(更易维护)
直接在XML中定义输入框样式,不需要动态设置字体:
- 首先在
res/values/styles.xml中新增自定义搜索文本样式:
<style name="CustomSearchTextStyle" parent="TextAppearance.AppCompat.SearchView.Query"> <item name="android:fontFamily">@font/poppins</item> <item name="android:gravity">center_vertical</item> <item name="android:includeFontPadding">false</item> <!-- 按需调整上下padding --> <item name="android:paddingTop">2dp</item> </style>
- 给SearchView添加样式引用:
<androidx.appcompat.widget.SearchView android:id="@+id/search_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerInParent="true" app:iconifiedByDefault="false" app:queryBackground="@android:color/transparent" app:queryHint="Search" app:searchIcon="@drawable/ic_search" <!-- 新增这一行样式引用 --> app:queryTextAppearance="@style/CustomSearchTextStyle" />
使用该方案可以删除Java代码中动态设置Typeface的逻辑,样式统一在XML中管理更方便。
你可以根据实际显示效果微调padding数值,直到提示文字和搜索图标视觉对齐即可。
内容的提问来源于stack exchange,提问作者mayra
相关产品推荐
相关产品推荐

