Почему динамически добавленные виджеты не отображаются?
Мой код RUNS (см. Источник ниже), но отображаются только виджеты из файла макета xml. Динамически созданные виджеты, код которых теперь запускается без ошибок, не показывают себя. Кто-нибудь знает, почему это будет? Кстати, есть Контакты (4), и, шагая по коду, возвращаемые значения действительны.
Единственное, что странно в vals, - это то, что два из четырех имен контактов имеют "\t" между именем и фамилией, a la "Barney\t Rubble" (я сомневаюсь, что это проблема, но удивляюсь, почему два будет, а два нет, когда я введу имена контактов точно таким же образом...)
@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 ответ
Вы никогда ничего не добавляете к LinearLayout
называется llay
, который находится внутри вашего ScrollView
,
Попробуйте добавить это в свой while
цикл:
llay.addView(llayDynamic);