代码之家  ›  专栏  ›  技术社区  ›  Mark A. Donohoe

如何基于布局创建XML友好控件?

  •  0
  • Mark A. Donohoe  · 技术社区  · 7 年前

    这是我的代码的简化版本(我去掉了许多其他属性,因此我们可以只关注一个属性“text”):

    public class RadioButton extends LinearLayout
    {
        private TextView textView;
    
        public RadioButton(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            initAttributes(attrs, 0);
        }
    
        private void initAttributes(AttributeSet attrs, int defStyle)
        {
            final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CheckBoxView, defStyle, 0);
    
            text = a.getString(R.styleable.RadioButton_text);
            if(text == null)
                text = "Not set";
    
            a.recycle();
        }
    
        @Override
        protected void onFinishInflate()
        {
            super.onFinishInflate();
    
            textView = (TextView)findViewById(R.id.textView);
            textView.setText(text);
        }
    
        private String text;
        public String getText() { return text; }
        public void setText(String newValue)
        {
            text = newValue;
    
            if(textView != null)
                textView.setText(text);
        }
    }
    

    <resources>
    
        <attr name="text" format="string" />
    
        <declare-styleable name="RadioButton">
            <attr name="text" />
        </declare-styleable>
    
    </resources>
    

    这是“可重用”单选按钮。xml的布局文件(注意:内部RadioButtonView是一个自定义渲染视图,可以正常工作):

    <?xml version="1.0" encoding="utf-8"?>
    <com.somedomain.reusable.ui.RadioButton
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical">
    
        <com.somedomain.reusable.ui.RadioButtonView
            android:id="@+id/radioButtonView"
            style="@style/DefaultRadioButtonView" />
    
        <TextView
            android:id="@+id/textView"
            style="@style/DefaultRadioButtonText" />
    
    </com.somedomain.reusable.ui.RadioButton>
    

    有了上述功能,我的控件的用户可以简单地将其包含在自己的布局文件中,就像这样。。。

    <include android:id="@+id/someRadioButton"
        layout="@layout/reusable_radiobutton" />
    

    在他们的代码中,使用以下内容,他们可以获得该实例,并根据自己的意愿使用它,就像这样。。。

    RadioButton someRadioButton = (RadioButton)findViewById(R.id.someRadioButton);
    someRadioButton.text = "Woot!";
    

    然而,这并不是。。。

    <include android:id="@+id/someRadioButton"
        layout="@layout/reusable_radiobutton"
        app:text="Hello World!" />
    

    它给了我一个警告,但在其他方面忽略了它。

    然后我试了一下。。。

    <com.somedomain.reusable.ui.RadioButton
        app:text="Hello World!" />
    

    那么,如何基于布局创建自定义视图,其他开发人员可以在自己的布局文件中简单地引用该视图,同时允许他们设置自定义属性呢?

    希望一切都有意义!:)

    注意:Android文档中谈到了我想要的“复合控件” as referenced here ,但他们没有给出使用布局定义复合控件的示例。然而,我觉得这很接近。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mark A. Donohoe    7 年前

    here 就这样。我没意识到你可以把一些东西膨胀到自己身上。然后使用合并标签为我解决了这个问题。