在运行时创建的复合Android组件

时间:2011-05-27 14:05:42

标签: android custom-view composite-component

电贺。我正在研究一个项目,并认为我会卷起一个复合组件。我将它们放在xml中并编写了一个扩展LinearLayout的新类。基本上,我在活动中需要大约五到六个。我想以编程方式在Activity中创建这些内容,因为我不知道在运行之前我需要多少。另外,我创建了一个xml文件来设置它们,我没有在下面包含它。我遇到的每个方法都存在问题。

以下是我制作的扩展LinearLayout的类中的方法段:

public ExtendedLinearLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    ...
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    ((Activity)getContext()).getLayoutInflater().inflate(R.layout.extended_linear_layout, this);
    ...
}

在活动中,这两个解决方案似乎与我正在寻找的最接近。

不知道在哪里使用这种方法:

ExtendedLinearLayout customViewClass = new ExtendedLinearLayout(this, attrs);
layout.addView(customViewClass)

不知道如何指定inflater应该使用此方法使用ExtendedLinearLayout:

LayoutInflater inflater = LayoutInflater.from(this);
inflater.inflate(R.layout.extended_linear_layout, parent_layout);

我可能会选择使用ListView - 但对于五到六个项目来说似乎有些过分。此外,之前曾与Flex合作过,至少似乎似乎是解决问题的合理方法。

谢谢, 兰德尔

---------------- UPDATE -------------------

我尝试过如下所述的方法。一旦我设置了所有内容,我就会得到一个InflationException:二进制XML文件行#8:错误的类膨胀。我感觉就像xml看起来很好。我可能会感到困惑的一件事是在哪里打电话给inflater。现在,我在自定义类的onFinishInflate()以及Activity中调用inflater,如下所示:

public class ExtendedLinearLayout extends LinearLayout {
    ...
public ExtendedLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.extended_linear_layout, null);
        ...
    }
}

在活动中:

public class TestActivity extends Activity {
    LinearLayout list;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        list = (LinearLayout) findViewById(R.id.simple_list);
        runTestCode();
    }
    private void runTestCode() {
        LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ExtendedLinearLayout layoutOne = 
                (ExtendedLinearLayout) inflater.inflate(R.layout.extended_linear_layout, list);
    }
}

谢谢,希望你有时间看看。我想通过在网上挖掘来弄清楚东西,但是从昨天早上开始我已经煮了好几个小时了。我距离重构为ListAdapter约2英寸。

---------------- UPDATE -------------------

这是xml文件

<?xml version="1.0" encoding="utf-8"?>
<com.anotherandroidblog.ExtendedLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    >
    <TextView
        android:id="@+id/text_one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text=""
        ></TextView>
    <TextView
        android:id="@+id/text_two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text=""
        ></TextView>
    <TextView
        android:id="@+id/text_three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        ></TextView>
</com.anotherandroidblog.ExtendedLinearLayout>

1 个答案:

答案 0 :(得分:0)

您需要在XML文件中使用完整的类名:而不是使根元素LinearLayout使其成为ExtendedLinearLayout的完整类名(包括包名)。然后LayoutInflater将知道该怎么做。

编辑:此外,attrs选项实际上并不可行(或者至少我不这么认为)。我还没有找到一种在运行时生成实际attrs对象实例的方法:没有公共构造函数,我希望这是框架在引擎盖下无法访问的另一个东西。