定制组件或常规组合

时间:2012-05-14 19:40:12

标签: android

我要创建一个可重用的界面,即年度选择器(仅一年)。本质上,这个组件应该有几个按钮和textview,滑动功能也很棒。

正如我所说,我努力使其可重复使用,但我不确定Android是否提供任何实现它的方法。我已经开始阅读“自定义组件”一文 - 这是我真正需要的吗?或者我应该创建类似于具有视图对象引用的常规组合类等?

感谢。

更新:这很简单 - 这是一个例子,如果有人遇到相同的情况

YearPicker.class

public class YearPicker extends LinearLayout {
    protected int _minValue = 1980;
    protected int _currentValue;
    protected int _maxValue;

    protected int _decrementValueView = R.id.decrement_value;
    protected int _previousValueView = R.id.previous_value;
    protected int _currentValueView = R.id.current_value;
    protected int _nextValueView = R.id.next_value;

    public YearPicker(Context context) {
        super(context);
    }

    public YearPicker(Context context, AttributeSet attrs) {
        super(context, attrs);
        Calendar calendar = Calendar.getInstance();
        _maxValue = calendar.get(Calendar.YEAR);
        _currentValue = _maxValue - ((_maxValue - _minValue) / 2);

    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);

        TextView curView = (TextView) findViewById(_currentValueView);
        curView.setText(Integer.toString(_currentValue));
        findViewById(_decrementValueView).setOnClickListener(
                _onDecrementValueClick);
    }

    protected OnClickListener _onDecrementValueClick = new OnClickListener() {
        @Override
        public void onClick(View v) {
            _currentValue--;
            TextView curView = (TextView) findViewById(_currentValueView);
            curView.setText(Integer.toString(_currentValue));
        }
    };
}

main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
    <include 
        layout="@layout/year_picker"/>

</LinearLayout>

year_picker.xml

<view xmlns:android="http://schemas.android.com/apk/res/android"
    class="localhost.yearpicker.YearPicker"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/decrement_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <TextView
        android:id="@+id/previous_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Small Text"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <TextView
        android:id="@+id/current_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/next_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Small Text"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <Button
        android:id="@+id/increment_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</view>

2 个答案:

答案 0 :(得分:2)

在您的情况下,我只是扩展一个更好的ViewGroup,将XML(用于样式和定位视图)扩展到其中,获取对这些View的访问权限,添加所有相关的set / get方法,就是这样。 如果相关,您还可以定义组件的属性,以便在XML中使用它时调整其自定义功能。

答案 1 :(得分:0)

您可能根本不需要自定义视图。我更喜欢保留单独的XML布局,我可以根据需要进行扩充,然后使用自定义OnClickListeners(或OnTouchListeners)控制它们

如果你需要覆盖基本视图的方法(例如onLayout或draw()方法),我只会求助于自定义视图。