我遇到了一个非常基本的Android布局问题。我把它简化为下面的示例。我有两种观点:
我将这些添加到我通过代码(而不是XML)创建的线性布局中。如果我先添加TextView,我会得到以下对我有意义的内容:
但是,如果我交换了两个layout.addView(...)
调用的顺序,则缺少TextView:
在第一种情况下,TextView扩展到它的首选宽度,然后MyCustomView将完成剩下的工作。我希望第二种情况表现得相似 - 我再次希望TextView与其理想宽度(IE只适合文本)一样宽,并希望自定义视图占据宽度的其余部分。我特别不想使用绝对大小 - 而是我希望自定义组件只占用残差。
在Swing中,这通常使用preferredSize完成,但在Android中似乎不存在。我错过了什么?感谢。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
MyCustomView myCustomView = new MyCustomView(this);
TextView textView = new TextView(this);
textView.setText("Sample Text");
layout.addView(myCustomView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
layout.addView(textView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
setContentView(layout);
}
public class MyCustomView extends View {
private Paint paint = new Paint();
public MyCustomView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// fill blue box
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.FILL);
canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
// draw red border
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
}
}
编辑11月18日美国东部时间下午5:52 根据@Elhanan,我已将两条addView(...)行更改为:
layout.addView(myCustomView, new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1));
layout.addView(textView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0));
答案 0 :(得分:1)
您需要将自定义视图的layout_width设置为0,并在添加时将layout_weight设置为1。
答案 1 :(得分:0)
自定义视图中的getWidth()和getHeight()调用会导致矩形填满整个屏幕。然后,当您添加TextView时,它将从屏幕上绘制。
如果您想要左侧的CustomView和右侧的TextView,请尝试像这样添加它们:
layout.addView(textView,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
layout.addView(myCustomView,
0,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
通过在第二个addView调用中传递索引0,您告诉LinearLayout在前面添加视图。