Android - 动态创建时,文本视图不可见

时间:2013-08-01 15:29:05

标签: java android textview

我正在尝试创建一个允许用户存储和保存联系人的应用。它可以保存,但列出有问题。

我有一个贯穿数据库的for循环,并为每个联系人(每行)打印一组数据,一个图像(实际上是一个字符串,因为它通过了路径)和一个字符串。它将它们打印在一个滚动视图中,每个联系人都有一个线性布局(每个联系人都有自己的线性布局,这样我可以让一个联系人各占一行)。然而,图像出来了,文本观点无处可寻。

使用log.d(textview.getText());它确认文本视图已创建并占用空间。 http://chesnutcase.heliohost.org/derpbox/itv1.png 两个"联系人"有名字,没有打印出来。中间的空间是由textview预先决定的。 http://chesnutcase.heliohost.org/derpbox/itv2.png 另外两个"联系人",但没有名字。彼此之间没有空间。或者至少是一个明显更小的空间。 代码:

DatabaseHandler db = new DatabaseHandler(this);
    int a = (int) (long) db.countRows();
    LinearLayout theLayout = (LinearLayout)findViewById(R.id.contactsList);
    for(int i = 0;i<a;i++){
        ImageButton image = new ImageButton(this);
        int density=getResources().getDisplayMetrics().densityDpi;
        LinearLayout.LayoutParams vp  = new LinearLayout.LayoutParams(density,density, 0.5f);
        image.setLayoutParams(vp);
        image.setScaleType(ImageView.ScaleType.FIT_END);
        int b = a - i;
        try {
            image.setImageBitmap(decodeUri(Uri.parse(db.getContactData("photo_path")[i])));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        theLayout.addView(image);
        TextView tv = new TextView(this);
        tv.setText(db.getContactData("name")[i]);
        Log.d("UserLog","name is "  + db.getContactData("name")[i]);
        Log.d("UserLog","textfield contains " + tv.getText());
        LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);
        tv.setLayoutParams(vp2);
        tv.setBackgroundColor(Color.RED);
        theLayout.addView(tv);
    }

任何解决方案?提前致谢

4 个答案:

答案 0 :(得分:2)

仔细检查您应用于联系人列表的LinearLayout的方向。

您将LayoutParams设置为错误TextView。你的TextView 0px乘以0px,权重为1。

LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);
tv.setLayoutParams(vp2);

尝试使用MATCH_PARENTWRAP_CONTENT常量之一。它们列在此处:http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#MATCH_PARENT

如果您希望TextView占据屏幕的剩余宽度,我会将权重保留为1,宽度为0,但您需要将高度设置为常量,如WRAP_CONTENT

您还要将ImageView的大小设置为设备屏幕密度(这是一个常量),而不是根据屏幕密度设置缩放大小。

答案 1 :(得分:1)

您可能需要调用 requestLayout(); 才能更新当前的视图布局。

theLayout.requestLayout();

此外,您似乎正在使用该布局参数创建一个宽度为0且高度为0的视图:

LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);

答案 2 :(得分:0)

最好将ListView用于此类列表。 您只需要编写一个Adapter,这表示在列表中创建一行的逻辑。

答案 3 :(得分:0)

我建议使用CursorAdapter和布局xml文件,这样您就可以将其设计为完全符合您的要求并进行预览。这比设置所有那些繁琐LayoutParams

容易得多

如果您必须动态创建它们,您可能会发现文本颜色与背景相同,请尝试将其设置为可见的亮红色以进行测试。如果您仍然没有看到文本,那么它的可见性可能不会设置为View.VISIBLE,最终布局可能不是正确的大小,为此设置一个方便的提示将背景设置为适当引人注目的颜色,即使没有文字你也应该看到阴影块。