动态生成的LinearLayouts重叠

时间:2012-10-24 21:08:51

标签: android android-layout

我是Android开发的新手,我还在学习Java,所以要温柔!

我正在创建一个可以获取任务信息的应用程序(我将其基于一种家庭作业计划程序),存储该信息,然后将其显示在列表中。该程序必须能够从后台文件动态生成列表。到目前为止,我已经管理了所有这些,但是当我为每个任务创建一个基本输出时,使用LinearLayout包含“subject”和“details”变量,它们出现在屏幕重叠上。他们似乎都在正确创造,但他们都被放在同一个地方。是否有我可以设置的属性使它们显示在垂直列表中???

这是我生成视图组并显示它们的代码段。这是从程序另一部分的循环中调用的,该循环查找内部存储中的文件数。

    TextView subjView;
    TextView detailView;
    RelativeLayout displayLayout;

    LinearLayout taskDisplay = new LinearLayout(this);
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);


    subjView = new TextView(this);      
    detailView = new TextView(this);
    displayLayout = (RelativeLayout) findViewById(R.id.relative_display_layout);

    subjView.setText(subject);
    detailView.setText(details);

    layoutParams.setMargins(0, 0, 0, 0);
    taskDisplay.addView(subjView, layoutParams);

    layoutParams.setMargins(10, 0, 0, 0);
    taskDisplay.addView(detailView, layoutParams);

    displayLayout.addView(taskDisplay);

2 个答案:

答案 0 :(得分:1)

如果我理解正确,我认为您的问题仅在于您宣布然后更改layoutParams边距,这两个边距将它们设置为相同,这与您的TextViews重叠。


修改

好吧,我仍然不能100%确定你是如何做这一切所以我的例子可能需要调整。我试图快速把它扔到一起,所以原谅我的任何小错误。

动态布局的新模拟:

TextView subjView, detailView;
RelativeLayout displayLayout, rl;

// I am assuming this is your main layout
displayLayout = (RelativeLayout) findViewById(R.id.relative_display_layout);

// Just using a for loop as an example of a loop event, not sure how you are accomplishing this
for(int i = 0; i < data.length(); i++) {

    RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 100);

    if (i > 0) {
        int rePositionRule = i;
        rllp.addRule(RelativeLayout.BELOW, rePositionRule);
    }

    RelativeLayout taskDisplay = new RelativeLayout(this);

    taskDisplay.setLayoutParams(rllp);
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(0, 0, 0, 0);

    LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    layoutParams2.setMargins(10, 0, 0, 0);

    subjView = new TextView(this);      
    detailView = new TextView(this);


    subjView.setText(subject);
    subjView.setLayoutParams(layoutParams);
    detailView.setText(details);
    detailView.setLayoutParams(layoutParams2);


    taskDisplay.addView(subjView);
    taskDisplay.addView(detailView);

    displayLayout.addView(taskDisplay);

}

答案 1 :(得分:0)

您的displayLayout是一个relativeLayout ..顾名思义,相对布局将元素相对于彼此放置。通常你会说“元素A应该低于元素B”等等。因为你没有为你正在创建的项目提供任何这些规则,所以它们都会以相对布局(这是相同的布局)进入默认位置屏幕的顶部..因此重叠)

如果您不想处理更改代码的麻烦,只需将您的displayLayout切换为xml和代码中的LinearLayout,并将其方向设置为垂直。如果它在屏幕上运行,您可能希望将其包装在滚动视图中

然而,听起来你真正想要的是ListView ......