如果为android:tint
设置了ViewGroup
属性,它是否适用于所有后代View
,或者它是否需要单独应用于每个?
下面的LinearLayout
(ButtonBar$LabeledButton
)包含ImageView
和TextView
,每个都指定了自己的颜色状态列表(CSL
)。
我想在android:tint
设置ViewGroup
一次,所以当它被禁用时,它的所有成员都会被禁用并相应地改变它们的色调(并且也不必覆盖setEnabled
)。
资源/布局/ buttonbar_labeledbutton_addnew.axml
<?xml version="1.0" encoding="utf-8"?>
<!--LinearLayout-->
<view class="ButtonBar$LabeledButton"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ButtonBar_LabeledButton_AddNew"
style="@style/ButtonBar_LabeledButton">
<ImageView
android:id="@+id/ButtonBar_LabeledButton_Image"
style="@style/ButtonBar_LabeledButton_Image"
android:src="@drawable/v__ic_add_circle_outline_black_24dp"/>
<TextView
android:id="@+id/ButtonBar_LabeledButton_Label"
style="@style/ButtonBar_LabeledButton_Label"
android:text="Add New"/>
</view>
<!--/LinearLayout-->
资源/价值/ styles.xml
<!--LinearLayout-->
<style name="ButtonBar_LabeledButton">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:orientation">horizontal</item>
<??-item name="android:tint">@color/buttonbar_csl</item-??>
</style>
<!--ImageView-->
<style name="ButtonBar_LabeledButton_Image">
<item name="android:layout_width">40dp</item>
<item name="android:layout_height">40dp</item>
<item name="android:tint">@color/buttonbar_csl</item>
</style>
<!--TextView-->
<style name="ButtonBar_LabeledButton_Label">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">14sp</item>
<item name="android:textColor">@color/buttonbar_csl</item>
<!--item name="android:tint">@color/buttonbar_csl</item-->
</style>
ButtonBar.LabeledButton
[Register("ButtonBar$LabeledButton")]
public class LabeledButton : LinearLayout
{
public LabeledButton(Context context, IAttributeSet attributes) : base(context, attributes) { }
public override bool Enabled
{
set
{
var image = FindViewById<ImageView>(Resource.Id.ButtonBar_LabeledButton_Image);
if( image != null )
image.Enabled = value;
var label = FindViewById<TextView>(Resource.Id.ButtonBar_LabeledButton_Label);
if( label != null )
label.Enabled = value;
base.Enabled = value;
}
}
}
更新
每个View和ViewGroup对象都支持各种XML属性。某些属性特定于View对象(例如,TextView支持textSize属性),但这些属性也可由任何可扩展此类的View对象继承。有些对于所有View对象都是通用的,因为它们是从根View类继承的(就像id属性一样)。并且,其他属性被视为“布局参数”,它们是描述View对象的某些布局方向的属性,由该对象的父ViewGroup对象定义。
android:tint
特定于ImageView
,被忽略。我没有检查ButtonBar$LabeledButton
的通胀构造函数中设置的属性,看它是否至少可以使用。声明一个自定义属性可以解决这个问题,但是它在现在需要的自定义类的通胀构造函数中对ImageView
和TextView
的赋值将被模糊(我更喜欢尽可能地利用框架来最小化任何额外的一次性代码b / c它所引入的维护和潜在的故障点)。
按钮栏
public class ButtonBar : LinearLayout
{
public ButtonBar(Context context, IAttributeSet attributes) : base(context, attributes) { }
public override bool Enabled
{
set
{
SetChilderenEnabled(value);
base.Enabled = value;
}
}
private void SetChilderenEnabled(bool value)
{
for (int i = 0; i < ChildCount; i++)
{
GetChildAt(i).Enabled = value;
}
}
[Register("us.sam.views.ButtonBar$LabeledButton")]
public class LabeledButton : LinearLayout
{
private ImageView _buttonIV;
private TextView _labelTV;
private int _buttonIV_src;
private string _labelTV_text;
public override bool Enabled
{
set
{
if (_buttonIV != null)
_buttonIV.Enabled = value;
if (_labelTV != null)
_labelTV.Enabled = value;
base.Enabled = value;
}
}
public LabeledButton(Context context, IAttributeSet attributes) : base(context, attributes)
{
ReadAttributes(context, attributes);
LayoutInflater inflater = LayoutInflater.From(context);
_labelTV = (TextView)inflater.Inflate(Resource.Layout.ButtonBar_LabeledButton_LabelTextView, this, false);
_buttonIV = (ImageView)inflater.Inflate(Resource.Layout.ButtonBar_LabeledButton_ButtonImageView, this, false);
_labelTV.Text = _labelTV_text;
_buttonIV.SetImageResource(_buttonIV_src);
AddViewInLayout(_buttonIV, ChildCount, _buttonIV.LayoutParameters);
AddViewInLayout(_labelTV, ChildCount, _labelTV.LayoutParameters);
}
private void ReadAttributes(Context context, IAttributeSet attributes)
{
Android.Content.Res.TypedArray typedArray = context.ObtainStyledAttributes(attributes, Resource.Styleable.LabeledButton);
_buttonIV_src = typedArray.GetResourceId(Resource.Styleable.LabeledButton_button_imageview_src, 0);
_labelTV_text = typedArray.GetString(Resource.Styleable.LabeledButton_label_textview_text);
typedArray.Recycle();
}
}
}
recordexpandablelistview_groupbuttonbar_trecords.axml
<?xml version="1.0" encoding="utf-8"?>
<!--LinearLayout-->
<view class="us.sam.RecordsView$RecordExpandableListView$GroupButtonBar"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RecordExpandableListView_GroupButtonBar_TRecords"
style="@style/RecordExpandableListView_GroupButtonBar">
<!--LinearLayout-->
<us.sam.Views.ButtonBar
android:id="@+id/ButtonBar"
style="@style/ButtonBar">
<include layout="@layout/ButtonBar_LabeledButton_AddNew"/>
</us.sam.Views.ButtonBar>
<ImageView style="@style/ListItem_Divider_Horizontal"/>
</view>
ButtonBar_LabeledButton_AddNew.axml
<?xml version="1.0" encoding="utf-8"?>
<!--LinearLayout-->
<view class="us.sam.views.ButtonBar$LabeledButton"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ButtonBar_LabeledButton_AddNew"
style="@style/ButtonBar_LabeledButton"
button_imageview_src="@drawable/v__ic_add_circle_outline_black_24dp"
label_textview_text="@string/ButtonBar_LabeledButton_LabelTextView_Text_AddNew">
</view>
ButtonBar_LabeledButton_ButtonImageView.axml
<?xml version="1.0" encoding="utf-8"?>
<!--<view class="us.sam.views.ButtonBar$LabeledButton$Button"-->
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ButtonBar_LabeledButton_ButtonImageView"
style="@style/ButtonBar_LabeledButton_ButtonImageView"/>
<!--android:src="@drawable/v__ic_add_circle_outline_black_24dp"-->
ButtonBar_LabeledButton_LabelTextView.axml
<?xml version="1.0" encoding="utf-8"?>
<!--view class="us.sam.views.ButtonBar$LabeledButton$Label"-->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ButtonBar_LabeledButton_LabelTextView"
style="@style/ButtonBar_LabeledButton_LabelTextView"/>
<!--android:text="Add New"-->
styles.xml
<!--LinearLayout-->
<style name="RecordExpandableListView_GroupButtonBar">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="android:orientation">vertical</item>
<!--use isChildSelectable() override in BaseExpandableListAdapter instead-->
<!--item name="android:clickable">true</item-->
</style>
<!--LinearLayout-->
<style name="ButtonBar">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:orientation">horizontal</item>
</style>
<!--LinearLayout-->
<style name="ButtonBar_LabeledButton">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginLeft">10dp</item>
<item name="android:orientation">horizontal</item>
</style>
<!--ImageView-->
<style name="ButtonBar_LabeledButton_ButtonImageView">
<item name="android:layout_width">40dp</item>
<item name="android:layout_height">40dp</item>
<item name="android:tint">@color/button_bar_csl</item>
</style>
<!--TextView-->
<style name="ButtonBar_LabeledButton_LabelTextView">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginLeft">10dp</item>
<item name="android:layout_gravity">center_vertical</item>
<item name="android:gravity">center_vertical</item>
<item name="android:textSize">14sp</item>
<item name="android:textColor">@color/button_bar_csl</item>
</style>
<style name="ListItem_Divider_Horizontal">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">1px</item>
<item name="android:background">@android:color/black</item>
</style>