Я могу получить контакты, но они отображаются неправильно - PullRequest
0 голосов
/ 10 марта 2012

С этим кодом:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.ondemandandautomatic_dynamicauthorize);
LinearLayout llay = new LinearLayout(this); 
llay.setOrientation(LinearLayout.HORIZONTAL); 

LinearLayout.LayoutParams llp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
llp.weight = 1.0f;

// Contacts data snippet adapted from http://saigeethamn.blogspot.com/2011/05/contacts-api-20-and-above-android.html 
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0) {
    while (cur.moveToNext()) {
          String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
          String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

          CheckBox cb = new CheckBox(getApplicationContext()); 
          cb.setText(id+name); 
          cb.setLayoutParams(llp); 
          llay.addView(cb);

        }
    }
// >Contacts data

ScrollView svh = (ScrollView) findViewById(R.id.scrollViewHost);
svh.addView(llay);        

// One cat on stackOverflow said to do this, another said it would be unnecessary
svh.invalidate();

}

... и макет xml:

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

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="2dip"
            android:text="@string/demand"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="2dip"
            android:text="@string/time"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="2dip"
            android:text="@string/space"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="2dip"
            android:text="@string/contact"
            android:textAppearance="?android:attr/textAppearanceMedium" />

    <ScrollView
        android:id="@+id/scrollViewHost"
        android:fillViewport="true"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >

    </ScrollView>

</LinearLayout>

... я получаю то, что вы видите здесь:

http://warbler.posterous.com/temporary-post-to-display-a-cosmetic-problem#

... итак, контакты извлекаются, но виджеты волей-неволей перетаскиваются на экран эмулятора, или это так (и идентификаторы / имена не отображаются рядом с флажками).

Обновлено: Я думал, что изменение кода на следующий может сработать, но это приводит меня к перспективе отладки в Eclipse.

Проблема в том, что последующие экземпляры виджетов не могут иметь то же имя, что и уже созданный (например, cbOnDemand)? Если так, как я могу обойти это?

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ondemandandautomatic_dynamicauthorize);

    ScrollView svh = (ScrollView) findViewById(R.id.scrollViewHost);

    // Contacts data snippet adapted from
    // http://saigeethamn.blogspot.com/2011/05/contacts-api-20-and-above-android.html
    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, null);
    if (cur.getCount() > 0) {
        while (cur.moveToNext()) {
            String id = cur.getString(cur
                    .getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur
                    .getString(cur
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            // Create a Linear Layout for each contact?
            LinearLayout llay = new LinearLayout(this);
            llay.setOrientation(LinearLayout.HORIZONTAL);

            LinearLayout.LayoutParams llp = new LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            llp.weight = 1.0f;

            CheckBox cbOnDemand = new CheckBox(getApplicationContext());
            cbOnDemand.setLayoutParams(llp);
            llay.addView(cbOnDemand);

            CheckBox cbTime = new CheckBox(getApplicationContext());
            cbTime.setLayoutParams(llp);
            llay.addView(cbTime);

            CheckBox cbSpace = new CheckBox(getApplicationContext());
            cbSpace.setLayoutParams(llp);
            llay.addView(cbSpace);

            TextView tv = new TextView(getApplicationContext());
            tv.setText(id + name);
            tv.setLayoutParams(llp);
            llay.addView(tv);

            svh.addView(llay);
            // One cat on stackOverflow said to do this, another said it
            // would be unnecessary
            svh.invalidate();
        }
    }
}

1 Ответ

1 голос
/ 10 марта 2012

Вам не следует использовать несколько TextViews - в вашем примере вы всегда будете ограничены 4. Вместо этого используйте ListView, и вы можете добавить к нему ноль или несколько контактов.Вот пример xml (обратите внимание на идентификатор в ListView):

<?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/android:list"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="0.7" />

<TextView android:id="@android:id/empty"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_weight="0.7"              
         android:text="@string/noFriendsList"/> 

</LinearLayout>

TextView существует только для отображения некоторого текста, когда представление списка пустое (также специальный идентификатор для него).В вашем коде вам нужно создать класс, который расширяет ArrayAdapter и установить его в качестве адаптера для представления списка, например:

ListView friendList = (ListView)findViewById(android.R.id.list);
    initialiseList();
    friendList.setAdapter(mFriends);

, где mFriends - мой пользовательский ArrayAdapter.Существует множество примеров использования ArrayAdapter и ListView в Интернете.

Редактировать: Когда вы создаете свой собственный адаптер списка в своей деятельности, например:

mFriends = new FriendListAdapter(this, R.layout.friend_list_row, friendList);

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

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

<CheckBox android:id="@+id/cb1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"/>

<CheckBox android:id="@+id/cb2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="5dip"
    android:layout_toRightOf="@+id/cb1"/>

<CheckBox android:id="@+id/cb3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="5dip"
    android:layout_toRightOf="@+id/cb2"/>

<TextView android:id="@+id/friendMobile"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"        
    android:textSize="12sp"             
    android:textStyle="bold"
    android:paddingLeft="5dip"
    android:layout_toRightOf="@+id/cb3" />  


</RelativeLayout>

Я не тестировал этот макет, но он не должен быть далекопрочь.

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