XML 无法以编程方式重建布局

XML layout cannot be reconstructed programmatically

所以一开始我制作了一个 XML 文档并在那里设计了我的布局。它运行完美,这里是:

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

    <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/scrollView">
        <LinearLayout
                android:id="@+id/list"
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
            <LinearLayout style="@style/Row">
                <LinearLayout style="@style/EntryContainer">
                    <ImageView style="@style/Pic"
                               android:id="@+id/imageView42" android:src="@drawable/ic_launcher"/>
                    <TextView style="@style/Rate"/>
                </LinearLayout>
                <LinearLayout style="@style/EntryContainer">
                    <ImageView style="@style/Pic"
                               android:id="@+id/imageView423" android:src="@drawable/ic_launcher"/>
                    <TextView style="@style/Rate"/>
                </LinearLayout>
            </LinearLayout>
            <LinearLayout style="@style/Row">
                <LinearLayout style="@style/EntryContainer">
                    <ImageView style="@style/Pic"
                               android:id="@+id/imageView2" android:src="@drawable/ic_launcher"/>
                    <TextView style="@style/Rate"/>
                </LinearLayout>
                <LinearLayout style="@style/EntryContainer">
                    <ImageView style="@style/Pic"
                               android:id="@+id/imageView3" android:src="@drawable/ic_launcher"/>
                    <TextView style="@style/Rate"/>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

还有款式:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Row">
        <item name="android:orientation">horizontal</item>
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">fill_parent</item>
    </style>

    <style name="EntryContainer">
        <item name="android:orientation">vertical</item>
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">fill_parent</item>
        <item name="android:layout_weight">1</item>
    </style>

    <style name="Pic">
        <item name="android:layout_width">100dp</item>
        <item name="android:layout_height">100dp</item>
        <item name="android:layout_gravity">center_horizontal</item>
    </style>

    <style name="Rate">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:text">@string/underpic_rate</item>
        <item name="android:gravity">center_horizontal</item>
    </style>
</resources>

好的,但我需要在运行时添加这些行,所以起初我尝试制作新视图并将具体样式传递给其构造函数(第三个参数)。它只是没有用。看起来完全没有添加任何样式。

然后我尝试使用 LayoutParams,它几乎成功了,但我无法改变我的 LinearLayouts 的方向。当我做类似的事情时:

myLinearLayoutObject.setOrientation(LinearLayout.HORIZONTAL);

它就是不听我的。

我可以 post 更多我的代码,但我不确定是否需要它。 基本上我不知道为什么将样式传递给 View 的构造函数不起作用。这将是最简单的解决方案。

您应该考虑改用 RecyclerView。这将允许您拥有一个基于基础数据集自动生成的相似视图元素列表。

如果您有一组动态的列表元素,这些元素会在您的应用程序的整个 运行 时间内发生变化,这将提供比您自己手动创建包含视图的列表更灵活和优雅的解决方案

学习会花费更多的时间,但在漫长的过程中是值得的运行。

您可以使用 LayoutInflater。

创建另一个 xml 代表行的布局文件 - firstrow.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          style="@style/Row">
            <LinearLayout style="@style/EntryContainer">
                <ImageView style="@style/Pic"
                           android:id="@+id/imageView42" android:src="@drawable/ic_launcher"/>
                <TextView style="@style/Rate"/>
            </LinearLayout>
            <LinearLayout style="@style/EntryContainer">
                <ImageView style="@style/Pic"
                           android:id="@+id/imageView423" android:src="@drawable/ic_launcher"/>
                <TextView style="@style/Rate"/>
            </LinearLayout>
        </LinearLayout>    

然后在你的代码中这样做:

LayoutInflater inflater = getActivity().getLayoutInflater();
LinearLayout rootView=(LinearLayout)inflater.inflate(R.layout.firstrow, null);
final LinearLayout container = (LinearLayout)findViewById(R.id.list);
container.addView(rootView);