Android:我可以在绘制之前更改视图的高度吗?

时间:2015-02-27 11:26:05

标签: java android android-studio

我想做以下事情:

rootLayout.getLayoutParams().height = 100;

目前我在我的“loadData'方法。问题是 - ' layoutParams'似乎是空的,直到“loadData'已被调用(但显然在显示之前)。

是否有某处我可以将此行放置在layoutParams实例化的位置,但仍然是在第一次显示视图之前?

3 个答案:

答案 0 :(得分:1)

    rootLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    rootLayout.getViewTreeObserver()
                            .removeOnGlobalLayoutListener(this);
                } else {
                    rootLayout.getViewTreeObserver()
                            .removeGlobalOnLayoutListener(this);
                }
                rootLayout.getLayoutParams().height = 100;
                rootLayout.requestLayout();
            }
        });

答案 1 :(得分:0)

您应该考虑将此视图的layoutParams设置为

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 100));
 rootLayout.setLayoutParams(lp);

所以你可以将layoutParams高度设置为100并假设你的父视图为linear layout,如果不是,那么你应该使用它的layoutparams

答案 2 :(得分:0)

在文档上,您可以查看视图中的所有回调,您可以覆盖https://developer.android.com/reference/android/view/View.html

如果你的视图位于那里指定了LayoutParams的XML布局中,你可以/应该把你的代码放在onFinishInflate

   @Override
   public void onFinishInflate() {
   }

如果您以编程方式执行所有操作,则可以覆盖布局传递

@Override
public void onLayout (boolean changed, int left, int top, int right, int bottom){
    // be carefull that this get's called several times
}
或者(在我看来,这是一种更好的方法),你可以欺骗视图的onMeasure以获得你想要的大小。例如,要使用maxWidth

的视图
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      // apply max width
      int measuredWidth = MeasureSpec.getSize(widthMeasureSpec);
      if (maxWidth > 0 && maxWidth < measuredWidth) {
         int measureMode = MeasureSpec.getMode(widthMeasureSpec);
         widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth, measureMode);
      }
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   }