используя флажок для фильтрации контактов и получения номера телефона - PullRequest
4 голосов
/ 26 февраля 2012

Я работаю над приложением, которое работает аналогично приложению обмена текстовыми сообщениями по умолчанию на всех телефонах Android.Моя проблема заключается в выборе нескольких пользователей для отправки SMS-сообщения.То, что я сделал до сих пор, хранит мои контакты в виде элементов списка с флажками.Теперь мне просто нужно получить номера телефонов от выбранных контактов.

Так что у меня возникли проблемы при выполнении.1) Извлечение номера телефона из контактов, отображаемых в моем просмотре списка 2) Отображение этого номера в текстовом просмотре в новом действии

Извините, если мой код трудно понять, пожалуйста, спросите, нужна ли вам очистка.

Это XML, в котором отображается список, называемый contact_manager.xml:

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <ListView
            android:id="@+id/contactList"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <Button
            android:id="@+id/showInvisible"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/showInvisible" />

    </LinearLayout>

Это моя активность, которая вызывает все вместе.

public final class ContactManager extends Activity {

public static final String TAG = "ContactManager";

private ListView mContactList;
private boolean mShowInvisible;
private Button mShowInvisibleControl;

/**
 * Called when the activity is first created. Responsible for initializing
 * the UI.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    Log.v(TAG, "Activity State: onCreate()");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contact_manager);

    // Obtain handles to UI objects

    mContactList = (ListView) findViewById(R.id.contactList);
    mShowInvisibleControl = (Button) findViewById(R.id.showInvisible);

    // Initialize class properties
    mShowInvisible = false;
    // mShowInvisibleControl.setChecked(mShowInvisible);
    mShowInvisibleControl.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {

        }
    });
    populateContactList();
}

/**
 * Populate the contact list based on account currently selected in the
 * account spinner.
 */
private void populateContactList() {
    // Build adapter with contact entries
    Cursor cursor = getContacts();
    String[] fields = new String[] { ContactsContract.Data.DISPLAY_NAME };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.contact_entry, cursor, fields,
            new int[] { R.id.contactEntryText });
    mContactList.setAdapter(adapter);
}

/**
 * Obtains the contact list for the currently selected account.
 * 
 * @return A cursor for for accessing the contact list.
 */
private Cursor getContacts() {
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] projection = new String[] { ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME };
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"
            + (mShowInvisible ? "0" : "1") + "'";
    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
            + " COLLATE LOCALIZED ASC";

    return managedQuery(uri, projection, selection, selectionArgs,
            sortOrder);
}

contact_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <CheckBox
        android:id="@+id/contactEntryText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/contactEntryText" />

</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/contactList"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <Button
        android:id="@+id/showInvisible"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/showInvisible" />

</LinearLayout>

Это мой приглашение_текст.xml. Это фактически текстовое представление, в которое я хочу ввести числа, чтобы я мог отправить массовое текстовое сообщение.

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/contacts"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:gravity="center"
                android:paddingBottom="10dp"
                android:paddingLeft="10dp"
                android:paddingTop="10dp"
                android:text="@string/contacts"
                android:textAppearance="?android:attr/textAppearanceLarge" />
            <!-- android:textColor="#fff" android:background="@drawable/header" for header background -->

            <Button
                android:id="@+id/contactsButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:text="@string/contacts" />
        </RelativeLayout>

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/enter_contact"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <AutoCompleteTextView
            android:id="@+id/contactnumber"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="@string/to" >

            <requestFocus />
        </AutoCompleteTextView>

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/message_to_send"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <EditText
            android:id="@+id/invite_text"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/message_join" />

        <Button
            android:id="@+id/sendtxt"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:onClick="doLaunchContactPicker"
            android:text="@string/send_txt" />
    </LinearLayout>

</ScrollView>

Если вы хотите, чтобы я опубликовал дополнительную информацию, пожалуйста, спросите.

Ответы [ 6 ]

2 голосов
/ 12 апреля 2012

Я не смотрел ваш код, но вот механизм, который работал для меня:

1. Поставьте setOnCheckedChangeListener на ваш флажок.

2. Если Checkbox равно Checked, добавьте этот контакт в arraylist.

3. Если CheckBox равно unchecked, удалите этот контакт изarraylist.

4. Начните активность в списке контактов с startActivityForResult() и переопределите onActivityResult().

5. До leaving contact activity установите selected contacts in intent.

6. Получите выбранные контакты в своей деятельности.

7. Теперь вы выбрали контакты, которые выможет отображаться в TextView.

Примечание: Для этого необходимо использовать настраиваемый адаптер списка:

Настраиваемый адаптер списка:

public class YourAdapterName extends BaseAdapter{

private Context mContext;
private ArrayList<string> mValuestoShow;

/**
 * Constructor to be called to initialize adapter with values.
 * @param context
 * @param vector
 */
public YourAdapterName(Context context, ArrayList<string> contacts){
    mContext = context;
    mValuestoShow = contacts;
}

public int getCount() {
    if(null != mValuestoShow){
        return mValuestoShow.size();
    }
    return 0;
}

public Object getItem(int position) {
    if(position < mValuestoShow.size())
        return  mValuestoShow.get(position);
    else
        return null;
}

public long getItemId(int position) {
    return 0;
}

/**
 * This method can be override to enable/disable particular list row.
 */
@Override
public boolean isEnabled(int position) {
    //Write your code here......
    return super.isEnabled(position);
}

public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            LayoutInflater li =(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = li.inflate(R.layout.contact_list_layout, null);
            holder = new ViewHolder();
            holder.name = (TextView)convertView.findViewById(R.id.name);
            holder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.name.setText(text goes here ....);

        holder.checkbox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if ( isChecked )
                    //Add contact...
                else
                    //Remove contact.
            }
        });

        return convertView;
    }

    class ViewHolder {
        TextView name;
        CheckBox checkbox;
    }

}

your_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp" >

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="50dp"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@android:color/black" />

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

</RelativeLayout>
1 голос
/ 11 апреля 2012

Нет ответа на ваш вопрос.Вы должны написать свой собственный адаптер и иметь поддержку множественного выбора.Я ответил на SO на аналогичную проблему (если это помогает, ОК, дайте мне знать, и я могу объяснить подробно):

Кнопка переключения просмотра списка Android

android: флажки в ListView (странное поведение выбранного элемента)

1 голос
/ 07 апреля 2012

Пожалуйста, следуйте приведенным ниже шагам, чтобы заставить его работать:

-> Иметь логический массив, размер которого равен курсору.Этот массив будет представлять проверенное состояние контакта.-> В xml сделать флажок не кликабельным и не фокусируемым.-> setOnItemClickListener для ListVIew и в методе onItemClick переключать значение логического массива на позицию, выбранный элемент.-> Установить OnClickListener для Button и метод onClick для прослушивателя, извлекающего числа из курсора следующим образом:

ArrayList<String> numbers=new ArrayList<String>();
cursor.moveToFirst();
for(int i=0;i<cursor.getCount;i++)
{
     cursor.moveToNext();
     if(selected[i])
     {
           //fetch contact from cursor
           //add number to numbers
     }
}

// Использование номеров ArrayList для отправки контактов, не похоже, что вы можете добавить несколько номеров к одному сообщениюв случае отправки сообщений на номера с помощью цикла, см. следующую ветку: Отправка смс нескольким людям в android amd Невозможно отправить смс с помощью SMSManager в Android

0 голосов
/ 11 апреля 2012

Я думаю, что приведенный ниже код даст результаты, которые вы ожидали ... Ваш основной класс будет выглядеть так, как показано ниже ...

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

public class GetSelectedContacts extends Activity{
    int CONTACTS_REQUEST_CODE =1;
    Activity thisActivity;
    ArrayList<String> selectedConatcts;
    LinearLayout contactdisp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        thisActivity = this;
        Button btn = (Button)findViewById(R.id.btn_selectContact);
        contactdisp = (LinearLayout)findViewById(R.id.lnr_contactshow);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(thisActivity,ListActivitySampleActivity.class);
                startActivityForResult(intent, CONTACTS_REQUEST_CODE);
            }
        });


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(data!=null){
            Bundle bundle = data.getExtras();
            if(requestCode ==1){
                selectedConatcts = bundle.getStringArrayList("sel_contacts");
                Log.v("", "Selected contacts-->"+selectedConatcts);
                if(selectedConatcts.size()<0){

                }else{
                    for(int i =0;i<selectedConatcts.size();i++){
                        LinearLayout lnr_inflate = (LinearLayout)View.inflate(thisActivity, R.layout.contacts_inflate, null);
                        EditText edt = (EditText)lnr_inflate.findViewById(R.id.edt_contact);
                        edt.setText(selectedConatcts.get(i));
                        contactdisp.addView(lnr_inflate);
                    }

                }
            }
        }
    }
}

Класс выбора контактов, например

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class ListActivitySampleActivity extends Activity {
    static ContentResolver cr;
    String[] phone_nos;
    ArrayList<String> selectedContacts = new ArrayList<String>();
    Activity thisActivity;
    Button btn;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);
        thisActivity = this;
        final ListView lst = (ListView)findViewById(R.id.listView1);
        populateContact();
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(thisActivity, android.R.layout.simple_list_item_multiple_choice, phone_nos);
        lst.setAdapter(adapter);
        lst.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        lst.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

            }
        });
        final int len = lst.getCount();
        final SparseBooleanArray checked = lst.getCheckedItemPositions();


        btn = (Button)findViewById(R.id.btn_send);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {       
                 for (int i = 0; i < len; i++)
                     if (checked.get(i)) {
                      selectedContacts.add(phone_nos[i]);
                       //you can you this array list to next activity
                      /* do whatever you want with the checked item */
                     }
                Bundle bundle = new Bundle();
                bundle.putStringArrayList("sel_contacts", selectedContacts);

                Intent contactIntent = new Intent();
                contactIntent.putExtras(bundle);
                setResult(1, contactIntent);
                thisActivity.finish();
//               Log.v("", "selected-->"+selectedContacts); 
            }
        });

    }
    private void populateContact(){
        Uri myContacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI ;
        Cursor mqCur =  managedQuery(myContacts, null, null, null, null);
        phone_nos = new String[mqCur.getCount()];
        int i =0;
        if(mqCur.moveToFirst())
        {              
            do
            {          
                String phone_no = mqCur.getString(mqCur
                        .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
                phone_nos[i] = phone_no;
                i++;
            }

            while(mqCur.moveToNext());
        }
    }
}
0 голосов
/ 11 апреля 2012

Я предлагаю вам взглянуть на учебник, который я написал в прошлом месяце по этой ссылке , чтобы управлять выбором флажка в списке (он помогает вам сохранять состояния и получать элементы по идентификаторам).

Я думаю, что было бы лучше, если бы вы управляли своим списком по идентификатору, но отображали для пользователя имя контакта.После этого вы можете передать свои идентификаторы и отправить их с механизмами, которые вам сказал Джит.

0 голосов
/ 26 февраля 2012

Я просто собираюсь опубликовать стратегический ответ. Используйте hashmap для адаптера списка. Используйте ключ, который не отображается, чтобы сохранить номер телефона для вызова. Разрешить множественный выбор в списке. Используйте сохраненные номера телефонов из выбранных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...