Android LinearLayout / Missing组件溢出?

时间:2013-11-18 03:35:44

标签: android android-linearlayout android-view android-ui android-custom-view

我遇到了一个非常基本的Android布局问题。我把它简化为下面的示例。我有两种观点:

  1. 自定义视图(MyCustomView),它只绘制一个带红色边框和
  2. 的蓝色矩形
  3. 一个显示“Sample Text”的TextView
  4. 我将这些添加到我通过代码(而不是XML)创建的线性布局中。如果我先添加TextView,我会得到以下对我有意义的内容:

    enter image description here

    但是,如果我交换了两个layout.addView(...)调用的顺序,则缺少TextView:

    enter image description here

    在第一种情况下,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));
    

2 个答案:

答案 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在前面添加视图。