【问题标题】:RelativeLayout -> match_parent is not the same size with parent viewRelativeLayout -> match_parent 与父视图的大小不同
【发布时间】:2012-01-17 15:01:13
【问题描述】:

我制作了一个简单的应用程序来说明我的问题。简要说明: 该应用程序仅包含一项活动。它的根视图是 TableLayout。后者填充了 TableRow 元素,而这些元素又从“row.xml”膨胀而来。这是代码:

TestActivity.java

public class TestActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutInflater inflater=getLayoutInflater();
    TableLayout table=new TableLayout(this);
    setContentView(table);
    TableRow row; 
    for(int i=0;i<3;i++){
        row=(TableRow)inflater.inflate(R.layout.row, null, true);
        table.addView(row);
    }

  }
}

在row.xml 中的TableRow 是根元素,它有一个子元素——RelativeLayout。注意RelativeLayout的属性android:layout_width="match_parent"。 行.xml:

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background"
>

<RelativeLayout
    android:id="@+id/announcement_row_relative_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >
</RelativeLayout>

然后我运行项目,打开 hierarchyViewer 工具并检查表格行的宽度和相应的相对布局 - 我分别看到 320 和 0。如果我在相对布局中声明“match_parent”,为什么它们不一样(320 和 320)?我附上 2 张图片,您可以自己观察元素的宽度。

【问题讨论】:

    标签: android android-relativelayout


    【解决方案1】:

    你的问题在这里:row=(TableRow)inflater.inflate(R.layout.row, null, true);

    你必须像这样膨胀你的行:

    row=(TableRow)inflater.inflate(R.layout.row, table, false);
    

    这样LayoutParams 将从您的 XML 文件中加载。

    【讨论】:

    • 我试图将该行更改为“row=(TableRow)inflater.inflate(R.layout.row, table, false); ”,但hierarchyviewer 仍然显示width=0。然后我尝试了行“row =(TableRow)inflater.inflate(R.layout.row,table,true);”并得到错误“java.lang.ClassCastException: android.widget.TableLayout cannot be cast to android.widget.TableRow”
    • 但是您的 TableLayout LauoutParams 是什么?我没有看到你在代码中的哪里设置它们..
    • 我以不同的方式做到了:我从 XML 文件中删除了 TableRow 标记,并将 RelativeLayout 附加到代码中的行。当我这样做时,行宽为 320,相对布局宽度为 317。这几乎可以,但仍然很奇怪。
    • TableLayout LauoutParams 重要吗?我没有设置它们,所以它们是我支持的默认值,但无论它们是什么,TableRow 宽度都是 320,所以它应该与 RelativeLayout 宽度相同。
    【解决方案2】:

    发生这种情况是因为您的 RelativeLayout 不包含子级,并且它的 onMeasure(..) 方法没有提供任何所需的宽度。

    【讨论】:

    • 如果我添加孩子,我的相对布局的宽度将等于最宽的孩子。但是,这仍然不是 TableRow 的宽度。为什么?我想要匹配父级的相对布局。
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多