加载视图的布局参数被忽略

我试图写我自己的自定义View ,我有问题的LayoutParams

这个想法是扩展ViewGroupLinearLayout

 public class MyView extends LinearLayout{ public MyView(Context context, AttributeSet attrs) { super(context, attrs); } public MyView(Context context) { super(context); } public void putContent(){ setOrientation(HORIZONTAL); LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); for (int i = 0; i < 5; i++){ View view = inflater.inflate(R.layout.item, null); TextView tv = (TextView)view.findViewById(R.id.item_text); tv.setText("Item " + i); addView(view); } } } 

正如你可以看到putContent方法膨胀一个项目,并添加到我的看法。 这是一个项目布局

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF"> <TextView android:text="TextView" android:id="@+id/item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000"/> </LinearLayout> 

和主屏幕布局

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android_layout_weight="1" android:text="@string/hello" /> <my.test.MyView android:id="@+id/my_view" android:layout_width="match_parent" android:layout_height="match_parent" android_layout_weight="1" /> </LinearLayout> 

和活动代码

 public class Start extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MyView myView = (MyView)findViewById(R.id.my_view); myView.putContent(); } } 

这是我得到的截图

在这里输入图像说明

所以问题是:item的根元素的属性被忽略

 android:layout_width="match_parent" android:layout_height="match_parent" 

但结果我想得到这样的东西(我得到这个结果时replaceaddView(view);用这一行)

 addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F)); 

在这里输入图像说明

所以问题是:我怎么能实现这个结果没有硬编码的LayoutParams? 谢谢你的帮助!

更新

我也看在debugging模式下的viewvariables字段 – mLayoutParamsnull ,并且当我添加充气view到父addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));在这里输入图像说明

但是刚刚加载的视图的孩子的mLayoutParams不是null。 为什么在视图膨胀时忽略xml布局中只有根元素的LayoutParams?

使用下面的语句来膨胀:

 View view = inflater.inflate( R.layout.item /* resource id */, MyView.this /* parent */, false /*attachToRoot*/); 

好吧,如果我理解正确,你有上面提到的XML在ll ,你正在添加一些东西( R.layout.item_layout )。

我看到的问题是:

  • 你的基础布局(被给出的xml,加载到ll )有match_parent ,但是我们不知道它是否有父类。 所以这个行为很难猜测。
  • 你没有指定什么布局参数是你添加的项目(仍然假设R.layout.item_layout不是你已经显示的XML)。 所以可以预期的行为,甚至是不确定的(所以预期这是意想不到的)。

可能是因为有太多的代码要发布到这里,我不知道,但是使用层次结构查看器查看树中的视图有什么参数可能会更好,所以您可以真正看到发生了什么。

另外,请注意, 并非所有视图都支持边距 。

即使一个视图可以定义一个填充,它也不提供任何对边距的支持。 但是,查看组提供了这样的支持。 有关更多信息,请参阅ViewGroup和ViewGroup.MarginLayoutParams。

在Android“layout_”参数中,引用当前视图在其父布局中的行为方式。 在这种情况下,它的父母是ll,但我们看不到那是什么。

至于LinearLayout里面的TextView的布局,由于LinearLayout是垂直的,所有的子对象都会自动将它们的layout_height重写为“wrap_content”,这样它们就可以正确地放在另一个之下了。

所以现在的问题是,你究竟看到了什么,你想看到什么?