如何修复横向截止的自定义 SearchView 背景?

Posted

技术标签:

【中文标题】如何修复横向截止的自定义 SearchView 背景?【英文标题】:How to fix cut-off custom SearchView background in landscape? 【发布时间】:2013-06-17 02:58:57 【问题描述】:

我已经按照这个question 的最佳答案使我的ActionBar 中的SearchView 小部件适合自定义主题。它适用于纵向模式,但在横向模式下,操作系统会缩小 ActionBar 的高度以最大化内容屏幕空间。而不是像其他项目一样将没有边距的 SearchView 小部件安装到 ActionBar 中,而是在顶部被切掉:

我翻遍了 android 源代码的 res 文件夹,但找不到任何专门的布局或资源来说明如何解决此问题,甚至 Android 本身如何设法将默认 Holo SearchView Widget 放入其中缩小的 ActionBar。

感谢任何见解。谢了。

【问题讨论】:

【参考方案1】:

您必须使用较小版本的编辑文本。可绘制对象的固有尺寸小于默认的可编辑文本可绘制对象。

查看这里使用的drawables

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/frameworks/support/v7/appcompat/res/drawable/abc_textfield_searchview_holo_dark.xml?av=f

【讨论】:

终于从我们的积压日志中解决了这个问题。非常感谢您的提示!【参考方案2】:

我遇到了类似的问题,只需更改EditText 的重力即可解决它:

try 
    int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
    AutoCompleteTextView searchPlate = (AutoCompleteTextView) searchView.findViewById(searchPlateId);

    //fixes the gravity (fixes text cutoff for landscape mode)
    searchPlate.setGravity(Gravity.LEFT|Gravity.BOTTOM);

catch (Throwable t)

    //not sure if the above code will always work (layouts change), but works well for the current API.
    t.printStackTrace();

【讨论】:

这似乎也是一种可能的解决方法,但是如果您有时间手动重绘资源,乔纳森的回答是可行的方法。【参考方案3】:

searchView 不容易定制,但我确实找到了解决方法。我的研究和代码主要取自这里找到的第一个答案:Changing the background drawable of the searchview widget。像这样在我的 XML 文件中设置背景后:

       `<SearchView
        android:layout_
        android:layout_
        android:background="@drawable/rounded_grey_search_bar"
        android:clickable="true"
        android:iconifiedByDefault="false"/>`

我将以下代码添加到我的 Java 文件中以更改 SearchView 的填充:

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);


    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
    searchView.findViewById(searchPlateId).setBackgroundResource(R.drawable.rounded_grey_search_bar);

    int voiceSearchPlateId = searchView.getContext().getResources().getIdentifier("android:id/submit_area", null, null);
    searchView.findViewById(voiceSearchPlateId).setBackgroundResource(R.drawable.rounded_grey_search_bar);

    int searchTextViewId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
    TextView searchTextView = (TextView) searchView.findViewById(searchTextViewId);
    searchTextView.setPadding(20, 20, 20, 20);

设置填充让我可以在我想要的地方获得文本。

【讨论】:

以上是关于如何修复横向截止的自定义 SearchView 背景?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 SearchView 上的默认图标,以便在 Android 的操作栏中使用?

如何更改SearchView上的默认图标,以便在Android的操作栏中使用?

如何修复错误 [Vue 警告]:未知的自定义元素?

如何修复我的自定义 conda 包的 conda UnsatisfiableError?

iOS 8 横向纵向模式下的自定义键盘

如何从 nib 中修复此“在托管对象上调用选择器 ... 已被 GC'ed”,其中包含未使用的自定义 UITableViewCell?