Почему динамически добавленные виджеты не отображаются? - PullRequest
2 голосов
/ 12 марта 2012

Мой код RUNS (см. Источник ниже), но отображаются только виджеты из макета XML файл. Динамически создаваемые виджеты, код которых теперь выполняется без ошибок [ough, up], не отображаются самих себя. Кто-нибудь знает, почему это будет? Кстати, есть контакты (4), и шаг за шагом код, возвращаемые значения действительны.

Единственное, что странно в vals, это то, что два из четырех имен Контактов имеют "\ t" между имя и фамилия, а-ля "Барни \ т щебень" (я сомневаюсь, что это проблема, но удивляюсь, почему два если бы я ввел имена контактов точно таким же образом ...)

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

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

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

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

    svh.addView(llay);

    // 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));

            // The previous LinearLayout was added to the ScrollView; these
            // in the loop will be added to that one
            LinearLayout llayDynamic = new LinearLayout(this);
            llayDynamic.setOrientation(LinearLayout.HORIZONTAL);

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

            CheckBox cbOnDemand = new CheckBox(getApplicationContext());
            cbOnDemand.setTag(id);
            cbOnDemand.setLayoutParams(llp);
            llayDynamic.addView(cbOnDemand);

            CheckBox cbTime = new CheckBox(getApplicationContext());
            cbOnDemand.setTag(id);
            cbTime.setLayoutParams(llp);
            llayDynamic.addView(cbTime);

            CheckBox cbSpace = new CheckBox(getApplicationContext());
            cbOnDemand.setTag(id);
            cbSpace.setLayoutParams(llp);
            llayDynamic.addView(cbSpace);

            TextView tv = new TextView(getApplicationContext());
            tv.setTag(id);
            tv.setText(name);
            tv.setLayoutParams(llp);
            llayDynamic.addView(tv);

            llayDynamic.invalidate();

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

Обновление: Хорошо, я исправил проблему с не отображаемыми виджетами, добавив:

            llay.addView(llayDynamic);

... до, возможно, ненужного вызова llayDynamic.invalidate ()

ОДНАКО, отображаемые виджеты все еще в беспорядке. См. http://warbler.posterous.com/widgets-are-still-deformedimitating-brain-dea, чтобы понять, что я имею в виду.

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

Зачем это нужно, и как я могу это решить?

1 Ответ

3 голосов
/ 12 марта 2012

Вы никогда не добавляете ничего к LinearLayout, называемому llay, который находится внутри вашего ScrollView.

Попробуйте добавить это в ваш while цикл:

llay.addView(llayDynamic);
...