我正在尝试制作一个Compose New Message屏幕,就像Android 4.1中内置的Messaging应用程序一样
我注意到当一个人选择一个联系人时,AutoCompleteTextView中插入了一个Button类型的东西。怎么可能?请帮助,因为我甚至不知道给它一个起始代码。 附: :我很乐意在创建新帖子时在StackOverflow的“Tags”条目中实现类似的功能。 I.E.单词(匹配的联系人)被按钮替换,右边有一个小X来删除它们! : - )
如何创建加载速度如此之快的适配器?一个想法是缓存所有联系人的列表(姓名,电话号码,电话号码类型)。还有其他想法吗? (比如,如果我们可以使用2个字符的初始搜索字符串来查询内容提供者,这将极大地减少自动完成结果的数量,从而减少加载适配器所花费的时间。但是当然,这需要设置在键入每个字符时自动完成文本视图的适配器。我的疑问是,可以从几个给定字母开始查询ContactsContract搜索结果,而不是仅使用Cursor从开始扫描整个数据库吗?)
autocompletetextview无法识别空格,只是没有结果。 我已经阅读了this但是无法实现它,是否有人有任何工作代码?
答案 0 :(得分:0)
您可以在Android GitHub上自由查看内置消息应用的源代码。您所需要的只是耐心阅读和理解代码。我提醒您并非所有代码都在公共SDK中,因此请谨慎使用。
1,MultiAutoComplete with Contact标签RecipientEditTextView。 RecipientsEditor是类扩展RecipientEditTextView
,他们在应用中使用它
更新:这是撰写屏幕的layout。第37行是您想要的自动完成文本视图。以下是它的布局。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<com.android.mms.ui.RecipientsEditor
android:id="@+id/recipients_editor"
android:hint="@string/to_hint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textFilter"
android:layout_weight="1"
android:textColor="#000000"
/>
<ImageButton android:id="@+id/recipients_picker"
android:src="@drawable/ic_launcher_contacts"
android:layout_marginLeft="5dip"
android:layout_width="50dip"
android:layout_height="fill_parent"
android:layout_weight="0"
android:visibility="gone"
/>
答案 1 :(得分:0)
我构建TokenAutoComplete来解决此问题,因为似乎没有一种简单的方法可以解决这个问题。这是解决第1点和第3点的基本示例:
public class ContactsCompletionView extends TokenCompleteTextView {
public ContactsCompletionView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected View getViewForObject(Object object) {
Person p = (Person)object;
LayoutInflater l = (LayoutInflater)getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
LinearLayout view = (LinearLayout)l.inflate(R.layout.contact_token, (ViewGroup)ContactsCompletionView.this.getParent(), false);
((TextView)view.findViewById(R.id.name)).setText(p.getName());
return view;
}
@Override
protected Object defaultObject(String completionText) {
//Stupid simple example of guessing if we have an email or not
int index = completionText.indexOf('@');
if (index == -1) {
return new Person(completionText, completionText.replace(" ", "") + "@example.com");
} else {
return new Person(completionText.substring(0, index), completionText);
}
}
}
contact_token的布局代码(您需要找到自己的x drawable)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/token_background">
<TextView android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="14sp"
android:text="Test Me"
android:padding="2dp" />
<ImageView
android:layout_height="10dp"
android:layout_width="10dp"
android:src="@drawable/x"
android:layout_gravity="center_vertical"
android:layout_marginLeft="3dp"
android:layout_marginRight="5dp" />
</LinearLayout>
令牌背景可绘制
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="#ffafafaf" />
<corners
android:topLeftRadius="5dp"
android:bottomLeftRadius="5dp"
android:topRightRadius="5dp"
android:bottomRightRadius="5dp" />
</shape>
人物对象代码
public class Person implements Serializable {
private String name;
private String email;
public Person(String n, String e) { name = n; email = e; }
public String getName() { return name; }
public String getEmail() { return email; }
@Override
public String toString() { return name; }
}
示例活动
public class TokenActivity extends Activity {
ContactsCompletionView completionView;
Person[] people;
ArrayAdapter<Person> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
people = new Person[]{
new Person("Marshall Weir", "marshall@example.com"),
new Person("Margaret Smith", "margaret@example.com"),
new Person("Max Jordan", "max@example.com"),
new Person("Meg Peterson", "meg@example.com"),
new Person("Amanda Johnson", "amanda@example.com"),
new Person("Terry Anderson", "terry@example.com")
};
adapter = new ArrayAdapter<Person>(this, android.R.layout.simple_list_item_1, people);
completionView = (ContactsCompletionView)findViewById(R.id.searchView);
completionView.setAdapter(adapter);
completionView.setTokenClickStyle(TokenCompleteTextView.TokenClickStyle.Delete);
}
}
布局代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.tokenautocomplete.ContactsCompletionView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
这是它的样子: