我有一个自定义的Android小部件,它抽象了一个基于 RecordDataField
的论坛字段 RelativeLayout
(基本上是对一个字段进行分组)和它的标签在一起,并采用自定义属性来确定标签相对于字段的位置,以显示下拉列表的下拉按钮,...)
public abstract class RecordDataField : RelativeLayout
{
protected TextView _tvLabel;
protected FieldLayout _rlInput;
//protected EditText _etInput;
protected FieldInput _etInput;
protected Button _btnDrop;
protected abstract FieldInput InstantiateInput();
}
FieldInput
是一个子类 EditText
,没什么特别的。
RecordDataField
的任何子项实现 InstantiateInput ,类似于以下内容( _etInput
最终会以值结束由 InstantiateInput
)
protected override FieldInput InstantiateInput()
{
View v = _inflater.Inflate(Resource.Layout.RecordDataFields, null);
_fieldInput = ((ViewGroup)v).FindViewById<FieldInput> Resource.Id.RecordDataFieldInput);
return (FieldInput)_fieldInput;
}
这适用于我的所有 RecordDataField
变体,但它们都是 FieldInput
( EditText
)基于。我现在需要更加通用,当我尝试将抽象方法 InstantiateInput
的返回类型更改为 View
时,我在基类中遇到了问题,b / c它在 _etInput
上设置了重力和其他属性,显然 View
不支持重力
public virtual void InitView()
{
_tvLabel = (TextView)_inflater.Inflate(Resource.Layout.RecordDataFieldLabel, this, false);
_tvLabel.Text = _label;
_tvLabel.Gravity = _labelGravity;
ViewGroup.LayoutParams tvLabelLayout = (ViewGroup.LayoutParams)_tvLabel.LayoutParameters;
tvLabelLayout.Width = _labelWidth;
RelativeLayout.LayoutParams lpLabel = new RelativeLayout.LayoutParams(tvLabelLayout);
lpLabel.AddRule(LayoutRules.AlignParentTop);
lpLabel.AddRule(LayoutRules.AlignParentLeft);
AddView(_tvLabel, lpLabel);
...
}
我可以从 InstantiateInput
返回哪种视图类型的建议,以便此小部件可以支持最多的视图类型(这里的动机是我想要使用 CheckBox
取代 EditText
( FieldInput
)?
答案 0 :(得分:1)
试试TextView (android.widget.TextView)
。 Checkbox
和EditText
都扩展TextView
,支持gravity
param以支持对齐内容