加载视图的布局参数被忽略
我试图写我自己的自定义View
,我有问题的LayoutParams
。
这个想法是扩展ViewGroup
( LinearLayout
)
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模式下的view
variables字段 – mLayoutParams
是null
,并且当我添加充气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”,这样它们就可以正确地放在另一个之下了。
所以现在的问题是,你究竟看到了什么,你想看到什么?