【问题标题】:Android - textviews are not visible when dynamically createdAndroid - 动态创建时文本视图不可见
【发布时间】:2013-08-01 23:41:03
【问题描述】:

我正在尝试制作一个让用户存储和保存联系人的应用程序。可以保存,但是列出有问题。

我有一个贯穿数据库的 for 循环,并为每个联系人(每一行)打印一组数据、一个图像(实际上它是一个字符串,因为它通过了路径)和一个字符串。它在滚动视图中打印它们,每个联系人都有一个线性布局(每个联系人都有自己的线性布局,这样我就可以让一个联系人每个占据一行)。图片出来了,但是文本视图却找不到了。

使用 log.d(textview.getText());它确认文本视图已创建并占用空间。 http://chesnutcase.heliohost.org/derpbox/itv1.png 两个有名字的“联系人”,没有打印出来。中间的空间大概是由文本视图。 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);
    }

有什么解决办法吗?提前致谢

【问题讨论】:

    标签: java android textview


    【解决方案1】:

    仔细检查您已将哪个方向应用于联系人列表的LinearLayout

    您将错误的LayoutParams 设置为您的TextView。你将TextView 0px x 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 的大小设置为设备屏幕密度(这是一个常数),而不是根据您的屏幕密度设置缩放大小。

    【讨论】:

    • 谢谢,我从来没有意识到我将它设置为 0px。我想要的图像大小恰好是屏幕密度的值。在多台设备上测试。
    • 如果我想让文本视图占据图像留下的剩余空间,我该怎么办?
    • 它们的屏幕密度是否都相同?如果您的设备是 MDPI 而不是 HDPI 或 XHDPI 怎么办?
    • 1 个 mdpi 和另一个 xhdpi
    • 编辑了我关于如何填充屏幕宽度剩余空间的答案。您应该只需要设置 textview 的高度来包装内容。
    【解决方案2】:

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

    theLayout.requestLayout();
    

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

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

    【讨论】:

    • 好吧,旋转屏幕确实会更新布局,对吧?如果图像和文本视图是在同一个函数中创建但只有一个出来的,那应该没有意义
    • 我添加了一些关于布局参数的内容。
    【解决方案3】:

    这样的列表最好使用ListView。 你只需要写一个Adapter,代表在列表中创建一行的逻辑。

    【讨论】:

      【解决方案4】:

      我建议使用CursorAdapter 和布局 xml 文件,这样您就可以将其设计成您想要的样子并进行预览。这比设置所有那些繁琐的LayoutParams 容易得多

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 2023-03-05
        相关资源
        最近更新 更多