CardView 未使用 LayoutInflater 正确充气

CardView is not inflating properly using LayoutInflater

我想以编程方式添加 CardView。

这是我的主要ActivityXML布局(activity_main.xml)

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

这是我的 CardViewTemplate (card_view_template.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/cardViewTemplate"
    android:layout_width="160dp"
    android:layout_height="190dp"
    android:layout_margin="10dp"
    android:clickable="true"
    android:foreground="?android:selectableItemBackground">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="This is a Card" />

</androidx.cardview.widget.CardView>

这是我的Java代码(MainActivity.java)

LayoutInflater inflater = getLayoutInflater();
ViewGroup parent = findViewById(R.id.linearLayout1);
inflater.inflate(R.layout.card_view_template, parent);

到这里一切正常。

现在我想在我的 activity_main.xml 中的某个位置添加卡片,因为我正在使用多个 CardView,我想在某个位置添加卡片。因此,我尝试了这个而不是上面的代码:

LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.card_view_template, null);
ViewGroup parent = findViewById(R.id.linearLayout1);
parent.addView(view, 0);

但是它没有正常充气。只有文本是可见的,卡片似乎没有出现。

我建议你直接使用线性布局,如:

LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.card_view_template, null);
LinearLayout LL = findViewById(R.id.linearLayout1);
LL.addView(view,0);

当动态添加视图时,我们不应该使用 null ViewGroup 父级扩充 View

在这个View view = inflater.inflate(R.layout.card_view_template, null);这里parent被指定为null,这导致了问题。

指定 View 将附加到的父级,并且仅将附加到父级设置为 false。这样将指定父级但不附加。

因此先声明parent(root)然后创建View并指定parent(root)并设置attach到parent(root)false

这是正确的说法 View view = inflater.inflate(R.layout.card_view_template, parent, false);

因此完整的代码将是:

LayoutInflater inflater = getLayoutInflater();
ViewGroup parent = findViewById(R.id.linearLayout1);
View view = inflater.inflate(R.layout.card_view_template, parent, false);
parent.addView(view, 0);