从ViewGroup继承android:tint属性

问题描述 投票:1回答:1

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

下面的LinearLayoutButtonBar$LabeledButton)包含ImageViewTextView,每个都指定了自己的颜色状态列表(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;
        }
    }    
}

更新

Attributes

每个View和ViewGroup对象都支持各种XML属性。某些属性特定于View对象(例如,TextView支持textSize属性),但这些属性也可由任何可扩展此类的View对象继承。有些对于所有View对象都是通用的,因为它们是从根View类继承的(就像id属性一样)。并且,其他属性被视为“布局参数”,它们是描述View对象的某些布局方向的属性,由该对象的父ViewGroup对象定义。

android:tint特定于ImageView,被忽略。我没有检查ButtonBar$LabeledButton的通胀构造函数中设置的属性,看它是否至少可以使用。声明一个自定义属性可以解决这个问题,但是它在现在需要的自定义类的通胀构造函数中对ImageViewTextView的赋值将被模糊(我更喜欢尽可能地利用框架来最小化任何额外的一次性代码b / c它所引入的维护和潜在的故障点)。

android android-layout
1个回答
0
投票

按钮栏

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>
© www.soinside.com 2019 - 2024. All rights reserved.