我正在尝试为我的应用程序制作多个联系人选择器。我正在使用带复选框的自定义布局来选择多个联系人。我面临的问题是,为了选择任何特定的联系人,我需要在复选框上完全点击,如果我点击该行的其他部分,则复选框不会被勾选。如何确保用户在整行中点击的位置勾选了复选框。
activity_contacts_picker.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btnShow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show Selected" />
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btnShow" >
</ListView>
</RelativeLayout>
custcontactview.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="5.0px"
android:paddingLeft="5.0px"
android:paddingTop="5.0px" >
<TextView
android:id="@+id/txtContactName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15.0dip"
android:layout_toLeftOf="@+id/checkBox1"
android:layout_alignParentLeft="true"
android:text="Medium Text"
android:textAppearance="?android:textAppearanceMedium" />
<TextView
android:id="@+id/txtContactNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txtContactName"
android:layout_alignParentLeft="true"
android:layout_marginLeft="15.0dip"
android:layout_toLeftOf="@+id/checkBox1"
android:text="Small Text"
android:textAppearance="?android:textAppearanceSmall" />
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="false" />
</RelativeLayout>
ContactsPicker.java
public class ContactsPicker extends ListActivity {
protected Object mActionMode;
public int selectedItem = -1;
private Button btnShowContacts;
private ListView myListView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts_picker);
myListView = getListView();
btnShowContacts = (Button) findViewById(R.id.btnShow);
btnShowContacts.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "Button Clicked",
Toast.LENGTH_SHORT).show();
String name = null;
String number = null;
long[] ids = myListView.getCheckedItemIds();
for (long id : ids) {
Cursor contact = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?", new String[] { id + "" }, null);
while (contact.moveToNext()) {
name = contact.getString(contact
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
number = contact.getString(contact
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
Toast.makeText(getApplicationContext(),
"Name: " + name + "\n" + "Number: " + number,
Toast.LENGTH_LONG).show();
}
}
});
ArrayList<Map<String, String>> list = buildData();
String[] from = { "Name", "Phone" };
int[] to = { R.id.txtContactName, R.id.txtContactNumber };
SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.custcontactview, from, to);
setListAdapter(adapter);
}
private ArrayList<Map<String, String>> buildData() {
ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
list.clear();
Cursor people = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, null, null, null,
"UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
while (people.moveToNext()) {
String contactName = people.getString(people
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String contactId = people.getString(people
.getColumnIndex(ContactsContract.Contacts._ID));
String hasPhone = people
.getString(people
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if ((Integer.parseInt(hasPhone) > 0)) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = " + contactId,
null,
"UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
+ ") ASC");
while (phones.moveToNext()) {
String phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Map<String, String> NamePhoneType = new HashMap<String, String>();
NamePhoneType.put("Name", contactName);
NamePhoneType.put("Phone", phoneNumber);
list.add(NamePhoneType);
}
phones.close();
}
}
people.close();
//startManagingCursor(people);
return list;
}
}
答案 0 :(得分:11)
尝试将此属性添加到ListView
机器人:可点击= “真”
另外,我没有看到你在myListView上设置Touch / Click监听器的位置。
答案 1 :(得分:6)
尝试更改复选框布局宽度以填充父级,如下所示,
android:layout_width="fill_parent"
猜猜它会对你有用:)
答案 2 :(得分:1)
我会在文本字段中添加一个点击监听器,如果点击则将复选框的状态更改为其相反的状态(单击&lt; - &gt; unlicked)
答案 3 :(得分:1)
首先,您可以使用CheckedTextView代替CheckBox。也许只有这项工作。
或
尝试设置CheckBox focusable =“false”,如果不起作用,则可以从XML布局的所有View中聚焦。
答案 4 :(得分:0)
如果您在列表项上使用button / checkbox / radiobutton,则列表项不可点击
您可以click here
解决问题