从 ViewGroup 继承 android:tint 属性



如果为ViewGroup设置了android:tint属性,它应该应用于所有后代View,还是需要单独应用于每个后代?

下面的LinearLayout(ButtonBar$LabeledButton)包含一个ImageViewTextView,每个都指定自己的颜色状态列表(CSL)。

我想在ViewGroup中设置一次android:tint,因此当它被禁用时,它的所有成员都会被禁用并相应地更改其色调(也不必覆盖setEnabled)。

resources/layout/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-->

资源/值/样式.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>

按钮栏.标记按钮

[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;
}
}    
}

更新

属性

每个视图和视图组对象都支持自己的各种 XML 属性。某些属性特定于 View 对象(对于 例如,文本视图支持 textSize 属性),但这些 属性也由任何可能扩展此属性的 View 对象继承 .class。有些是所有 View 对象共有的,因为它们是继承的 从根视图类(如 id 属性)。并且,其他 属性被视为"布局参数",即属性 描述视图对象的某些布局方向,如 由该对象的父视图组对象定义。

android:tint特定于ImageView,并被忽略。我没有检查ButtonBar$LabeledButton的膨胀构造函数中设置的属性,看看它是否至少可以使用。 声明自定义属性可以解决这个问题,但是随后它被分配给ImageViewTextView他们现在需要的自定义类的膨胀构造函数将被掩盖(我更喜欢尽可能多地利用框架来最小化任何额外的、一次性的代码 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"-->

样式.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>

最新更新