为什么动态添加的小部件不显示?

时间:2012-03-12 15:24:41

标签: android android-layout dynamic android-emulator android-widget

我的代码RUNS(参见下面的源代码),但显示的唯一小部件是来自xml布局的小部件 文件。动态创建的小部件,现在运行的代码没有hicc [ough,up],不显示 他们自己。有人知道为什么会这样吗?顺便说一句,有联系人(4),并逐步通过 返回值的代码有效。

val中唯一奇怪的是四个Contact名称中的两个之间有一个“\ t” 第一个和最后一个名字,一个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的子节点)是一个问题。 / p>

为什么会这样做,我该如何解决?

1 个答案:

答案 0 :(得分:3)

您永远不会向名为LinearLayout的{​​{1}}添加任何内容,该llay位于ScrollView内。

尝试在while循环中添加此内容:

llay.addView(llayDynamic);