如何使XML元素成为可重用的蓝图?

时间:2016-08-11 15:34:29

标签: android xml layout

我的XML文件如下:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/border">
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/rants_list_linear_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    </LinearLayout>
</ScrollView>

然后我有一个res / layout / sonich.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    android:id="@+id/sonich"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="TextView"
    android:textSize="32sp"
    xmlns:android="http://schemas.android.com/apk/res/android"/>

我的目标是使上面的TextView成为可重用的视图,即在应用程序中多次引用它以创建上述文本视图中指定的属性的文本视图。

因此,在主要活动中,我执行以下操作:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.rants_list_linear_layout);
    for (int i = 0; i< 100; i++) {
        TextView txt = (TextView) findViewById(R.id.sonich);
        linearLayout.addView(txt);
    }

然而,这会产生以下错误:

  

java.lang.IllegalArgumentException:无法将空子视图添加到   的ViewGroup

这表明findViewById()方法返回一个空引用。我不明白为什么,因为文本视图在xml文件中定义良好,并且findViewById()方法在线性布局之前很好地适用了几行。

如果我将代码更改为:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.rants_list_linear_layout);
    for (int i = 0; i< 100; i++) {
        TextView txt = new TextView(this);
        txt.setText("TextView");
        txt.setTextSize(32);
        linearLayout.addView(txt);
    }
一切正常。但是,这不是我想要的。我想尽可能多地将代码外包给xml文件。毕竟,存在xml文件以提供指定布局,视图等及其属性的有组织方式,而Java代码是处理应用程序功能的代码。

请您解释一下这个错误源于什么以及如何以编程方式创建文本视图(或任何视图),同时引用xml文件来推断视图&#39;特性

1 个答案:

答案 0 :(得分:1)

    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.rants_list_linear_layout);
    LayoutInflater inflater = LayoutInflater.from(linearLayout.getContext());
    for (int i = 0; i< 100; i++) {
        View sonich = inflater.inflate(R.layout.sonich, linearLayout, false);
        TextView txt = (TextView) sonich.findViewById(R.id.sonich);
//      Now you don't need to do these since the XML takes care of it
//      txt.setText("TextView");
//      txt.setTextSize(32);
        linearLayout.addView(txt);
    }