自定义LinearLayout在覆盖onMeasure或设置为match_parent后无法添加视图

时间:2017-11-08 09:34:58

标签: android android-layout android-custom-view

  

我不是英语母语用户。抱歉语法错误和拼写错误。

我有一个包含View的Dialog。 View包含一个包含CustomView的XML文件。从LinearLayout继承的CustomView使用addView()方法添加视图。

  

问题是:

  1. 当CustomView的layout_height设置为match_parent时,CustomView中的子视图将无法显示。

  2. 将CustomView的layout_height设置为wrap_content后,会显示子视图,但onMeasure()方法需要的时间太长。

  3. 我覆盖了onMeasure()方法。该方法并没有减慢我的应用程序。但是,孩子的观点再次消失。

2 个答案:

答案 0 :(得分:0)

无法对其进行测试,但您的onMeasure()方法似乎存在许多错误。第一个是关于遗失的父母。

int desiredHeight = mChildHeight * mEditors.size() - 1
            + (mViewOther == null ? 0 : mViewOther.getHeight())
            + (mViewTitle == null ? 0 : mViewTitle.getHeight());

应该阅读

int desiredHeight = mChildHeight * (mEditors.size() - 1)
            + (mViewOther == null ? 0 : mViewOther.getHeight())
            + (mViewTitle == null ? 0 : mViewTitle.getHeight());

第二个错误是关于您对 setMeasuredDimension() 的致电。这是没有必要,因为这是对super.onMeasure(...)的调用。去检查来源。

第三个错误是关于何时致电super.onMeasure(...)。您想要更改超类的衡量方式,因此请勿在开头调用super.onMeasure(...) ,而在自定义onMeasure 结尾处。< / p>

第四个错误与第三个错误有关;它是关于调用super.onMeasure(...)时使用的参数。不要使用常规LinearLayout参数,而是使用计算值。要从您的高度变量中制作新的MeasureSpec,请执行以下操作:

int newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, heightMode);

然后致电super.onMeasure(widthMeasureSpec, newHeightMeasureSpec);

答案 1 :(得分:0)

我想问题是LinearLayout的默认方向是水平的(doc),所以如果自定义视图的第一个子宽度符合父宽度(match_parent),你会看到只有一个项目 - 第一个。

尝试使用以下更改修改自定义视图的init()方法:

private void init() {
    this.mEditors = new HashMap<>();
    mEditors.put("Other", new DataVO("other"));
    setOrientation(VERTICAL);
}

我希望它会有所帮助。