具有现有控件的自定义视图

时间:2013-11-07 19:01:36

标签: android custom-controls android-custom-view visual-editor

我正在尝试创建一个可重用的控件,我可以添加我喜欢的已经存在的控件,所以我不需要任何属性,无需添加任何内容。

当我将“自定义视图”拖动到布局时,我只希望控件显示我的Visual Editor。

我有一个简单的 view_textseek.xml 作为示例布局,我不希望每次我想要“Text and a Seekbar”重新创建以防我在3个不同的地方使用它(例如:后来的一个颜色选择器)。或者只是一个带有“TextView”和“SeekBar”的控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/view_textseek_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:paddingLeft="15dp"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:text="@string/view_textseek_text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <RelativeLayout
        android:id="@+id/view_textseek_container_seekbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/view_textseek_text"
        android:paddingLeft="10dp"
        android:paddingTop="10dp"
        android:paddingRight="10dp"
        android:paddingBottom="5dp" >

        <SeekBar
            android:id="@+id/view_textseek_seekbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:max="255"
            android:progress="0" />
    </RelativeLayout>

</RelativeLayout>

这基本上是我的班级:

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.RelativeLayout;

public class TextSeekView extends RelativeLayout
{

    public TextSeekView(Context context) { super(context); init(context); }
    public TextSeekView(Context context, AttributeSet attrs) { super(context, attrs); init(context); }
    public TextSeekView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); }

    protected void init(Context context)
    {
        if (!isInEditMode())
        {
            LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            layoutInflater.inflate(R.layout.view_textseek, this, true);
        }
    }
}

正如您所看到的,我只想“收集”多个已存在的控件,并使用一个“视图”或“控件”来处理这些控件。它没有出现在编辑器中。

或者这是由于某些旧类型的愚蠢错误,您必须重新启动环境才能正确加载“自定义”视图?

我在其他视图中不需要特殊属性,也没有任何特殊属性,我只是希望能够在添加它或任何其他布局时反复显示此布局。

与C#一样,向控件添加3个文本框只会导致每次使用3个文本框。然后,只要你想要3个文本框,就可以在窗体上拖出控件 - 仅此而已!

1 个答案:

答案 0 :(得分:1)

更改此代码:

protected void init(Context context) {
    LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    layoutInflater.inflate(R.layout.view_textseek, this, true);

    if (!isInEditMode()) {
        // isInEditMode returns true when you show a view on graphical editor. Returns false while showing on running app.
    }
}