我尝试以编程方式将一些GUI元素(如ImageView或TextView)添加到LinearLayout。但是元素没有显示出来。
要查看是否绘制了元素,我为每个元素设置了不同的背景颜色。结果是我只能看到LinearLayout的背景颜色。但为什么呢?
public class MyLinearLayout extends LinearLayout {
public MyLinearLayout(Context context) {
super(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
setLayoutParams(params);
setBackgroundColor(Color.RED);
imageView = new ImageView(context);
params = new LinearLayout.LayoutParams(100, 100);
imageView.setLayoutParams(params);
imageView.setBackgroundColor(Color.BLUE);
addView(imageView);
}
}
奇怪的是,我可以看到LinearLayout的红色背景颜色,但是在ImageView的大小。如果我添加一些其他GUI元素,如TextView,我可以看到LinearLayout如何增长。但我看不到TextView。
我真的很困惑,因为这不是我第一次做这样的事情。你能告诉我我做错了吗?
这是layout.xml文件的片段:
<LinearLayout android:layout_width="match_parent"
android:layout_height="45dp"
android:id="@+id/bottom_bar"
android:layout_alignParentBottom="true"
android:gravity="bottom">
<FrameLayout android:id="@+id/block_edit_delete_layout"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:background="@drawable/block_edit_delete_selector">
<ImageView android:layout_height="match_parent"
android:layout_width="wrap_content"
android:src="@drawable/block_edit_delete"
android:scaleType="fitXY"
android:contentDescription="@string/delete"/>
</FrameLayout>
<LinearLayout
android:id="@+id/block_edit_progress"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="center"
android:orientation="horizontal"/>
<FrameLayout android:id="@+id/block_edit_random_layout"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:background="@drawable/block_edit_delete_selector">
<ImageView android:layout_height="match_parent"
android:layout_width="wrap_content"
android:src="@drawable/block_edit_random"
android:scaleType="fitXY"
android:contentDescription="@string/random_numbers"/>
</FrameLayout>
</LinearLayout>
ID为block_edit_progress
的LinearLayout是类MyLinearLayout
的多个实例的容器布局。实例将添加到代码中:
for(int i = 0; i < numberOfMyLinearLayouts; i++) {
MyLinearLayout v = new MyLinearLayout(getContext());
addView(v);
}
我希望这会有所帮助。
答案 0 :(得分:1)
如果我将您的代码转换为xml,它将类似于:
<LinearLayout layout_width=wrap_content, layout_height = wrap_content>
<LinearLayout id= MyLinearLayout>//just an idea, syntax may be wrong
<LinearLayout layout_width= 100, layout_width=100>
<ImageView color=BLUE>
</ImageView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
每当你在一个视图上调用setLayoutParams时,你给出的参数params
应该是父元素。
如果您希望linearlayout成为linearlayout的父级,请尝试使用 MATCH_PARENT 作为宽度,高度,如果您希望视图跨越宽度,视图的父级高度
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
setLayoutParams(lp);//lp is parent view
另外试试这个,以防视图添加到您的视图右侧,并且您无法在屏幕上看到它们
yourview.setOrientation(LinearLayout.VERTICAL);
答案 1 :(得分:0)
将线性布局的宽度和高度更改为match_parent
,并查看其更改方式。 wrap_content
只会显示线性布局的内容,这似乎是您的问题。
答案 2 :(得分:0)
我解决了这个问题。 (或者找到了解决方法)
我将完整的初始化内容移出了MyLinearLayout的构造函数。如果我在完全生成布局后再添加一个视图,那么一切正常。
像这样:
MyLinearLayout ll = new MyLinearLayout(getContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100, 100);
ll.setLayoutParams(params);
ll.setBackgroundColor(Color.RED);
ImageView v = new ImageView(getContext());
params = new LinearLayout.LayoutParams(50, 50);
v.setLayoutParams(params);
v.setBackgroundColor(Color.GREEN);
ll.addView(v);
addView(ll);
我不知道为什么其他方式不起作用。谢谢你的快速答案!