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);