我不是英语母语用户。抱歉语法错误和拼写错误。
我有一个包含View的Dialog。 View包含一个包含CustomView的XML文件。从LinearLayout继承的CustomView使用addView()
方法添加视图。
问题是:
当CustomView的layout_height设置为match_parent
时,CustomView中的子视图将无法显示。
将CustomView的layout_height设置为wrap_content
后,会显示子视图,但onMeasure()
方法需要的时间太长。
我覆盖了onMeasure()
方法。该方法并没有减慢我的应用程序。但是,孩子的观点再次消失。
答案 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);
}
我希望它会有所帮助。