Java 为什么要设置;布局“U宽度”;布局xml中的RelativeLayout的固定值无效?

Java 为什么要设置;布局“U宽度”;布局xml中的RelativeLayout的固定值无效?,java,android,android-layout,android-relativelayout,Java,Android,Android Layout,Android Relativelayout,我想将RelativeLayout的宽度和高度设置为固定值。我的item\u view.xml如下所示 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="100dp" android:layout_height="100dp" andr

我想将
RelativeLayout
的宽度和高度设置为固定值。我的
item\u view.xml
如下所示

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:orientation="vertical"
    android:background="#00ff00">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="abc"/>

</RelativeLayout>
最后是
MainActivity.java
中的generateView函数

private void generateItemView()
{
    LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = layoutInflater.inflate(R.layout.item_view, null);

    RelativeLayout containerView = findViewById(R.id.container);
    containerView.addView(itemView);
}
这就是结果

如您所见,这不是100dpX100dp大小

另一方面,如果我以编程的方式这样做,它就会工作。这里是更新后的generateView函数

private void generateItemView()
{
    LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = layoutInflater.inflate(R.layout.item_view, null);

    int sizeDp = 100;
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    int sizePx = Math.round(sizeDp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(sizePx, sizePx);
    itemView.setLayoutParams(params);

    RelativeLayout containerView = findViewById(R.id.container);
    containerView.addView(itemView);
}

而且效果很好


我的问题是,为什么不能在布局xml文件中使用布局宽度和布局高度属性?

您可能需要在调用layoutinflator.inflate时设置父级:
layoutinflator.inflate(R.layout.item\u视图,containerview,false)。您还需要重新安排代码,以便在实例化containerview后运行


有关为什么会发生这种情况的更详细答案,请查看您的问题在这一行:

当您将
null
作为父级传递时,任何
layout\uu
属性都将被忽略。为了保留它们并使它们生效,您必须传递一个父级

View itemView = layoutInflater.inflate(R.layout.item_view, containerView, false);
您的IDE应该就这种情况向您发出警告:

View itemView = layoutInflater.inflate(R.layout.item_view, null);
View itemView = layoutInflater.inflate(R.layout.item_view, containerView, false);