方案选型
====
XML中使用自定义 ViewGroup 的方式
-
通过
addView()
方法将需要的控件添加到ViewGroup
中 -
通过在
xml布局文件
中配置需要包含的控件 -
混合布局:1+2
方案优缺点对比
-
方案1优点在于简洁,完全不需要另外配置
xml布局文件
,但也正是因此,它不具备在xml布局文件
中动态配置子View的扩展性 -
方案2优点是具有完全的可配置性,可在
xml布局文件
中任意配置子View
,但缺点也很明显:
-
通用的子
View
仍然需要在每个使用该ViewGroup
的xml布局文件
中配置,过于繁琐 -
在
xml布局文件
中配置在ViewGroup
下的子View
都会被 add到ViewGroup
下,无法进一步分配
- 方案3的具有方案2的可配置性,同时又能通过方案1的方式来解决方案2的第1个缺点,也可以通过重写
ViewGroup
的addView()
方法来解决方案2的第2个缺点。
结论
–
由于前述的需求,我需要1个通用的 TextView
来作为提示文本,同时又需要一个 ViewGroup
来存放从xml布局文件中加载进来的子View
,这2个正对应方案2的2个问题,方案3正好能满足需求。
项目实施
====
在编写的过程中,有参考Google官方的 TextInputLayout
,这个控件很有意思,它结合 EditText
一起使用的时候可以对hint
文本进行移动,具体情况想了解可以搜一下看看。
TextInputLayout
重写的 addView()
方法:
public void addView(View child, int index, LayoutParams params) {
if (child instanceof EditText) {
FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(params);
flp.gravity = 16 | flp.gravity & -113;
this.i