自动完成文本视图和完成提示视图

19

我目前正在使用AutocompleteTextView组件实现自动完成字段。

我试图添加一个带有结果数的完成提示,只想将其与下拉列表元素样式不同。该组件上有一个名为completionHintView的属性,但每次我给它之前定义好的布局时,都会抛出一个NullPointerException

是否有人能提供一个可行的示例,说明如何样式化完成提示?


似乎没有人有一个例子 :) 想展示一些代码,这样也许我们可以一起解决问题? - Alex Florescu
1个回答

5

您能详细说明一下您想要应用哪种样式吗?

如果只是基本的文本样式,您可以构建一个 Spannable 并将结果设置为完成提示,因为它接受一个 CharSequence。在 这篇文章 中,有一个构建 Spannable 并对其应用样式的示例。

如果您正在寻找一种实际上操作 TextView 参数(例如填充)的方法,那么 AutoCompleteTextView源代码 似乎提供了一个提示(双关语意味着“提示”和“线索”)。

private View getHintView(Context context) {
    if (mHintText != null && mHintText.length() > 0) {
        final TextView hintView = (TextView) LayoutInflater.from(context).inflate(
                mHintResource, null).findViewById(com.android.internal.R.id.text1);
        hintView.setText(mHintText);
        hintView.setId(HINT_VIEW_ID);
        return hintView;
    } else {
        return null;
    }
}

这表明Android会在你指定的资源引用中查找id为text1的控件。这种资源的最基本版本只包含一个id为此的TextView控件:
<?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:padding="10dp"
        android:textColor="#FF0000" android:textSize="16sp" />

将上述内容保存在布局文件中(例如completion_hint_view.xml),然后从您的AutoCompleteTextView中按如下方式引用它:
<AutoCompleteTextView android:id="@+id/autocomplete_textview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:completionHintView="@layout/completion_hint_view"/>

第二个选项可能是最容易使用的,它将给您完全访问TextView的参数。如果您需要对此视图中的文本应用多个样式,可以结合第一个建议,因为那样会给您更大的灵活性。

如果这些建议都不够用,我可以想到一些不太优雅的解决方法,这些方法可能允许您获得相同的结果。


请注意:您指定的视图必须仅为TextView,不能将其包装到Layout中,否则会崩溃并显示“java.lang.IllegalStateException: The specified child already has a parent.”消息。似乎操作系统会调用findViewById方法,并将其附加到DropDown(对我来说听起来像一个错误)。这在SDK 28中发生了。我没有检查其他任何SDK。 - lionscribe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接