【问题标题】:Add many CardViews with onclick method programmatically以编程方式使用 onclick 方法添加许多 CardView
【发布时间】:2020-12-19 00:42:53
【问题描述】:

我还是 Android 新手,我想在每次单击按钮时向活动添加一个 CardViewCardView 上面有文字和背景图片。我已经有了可以添加这个的 XML 文件,但是因为我希望能够添加多个,所以我不能使用 。第一个图像是单击按钮一次,第二个图像是单击按钮 3 次。我已经有了TextViewonClick,上面写着“单击添加块”和CardView 的XML,但我无法做到,以便您可以添加它们并更改@987654330 中的文本@在他们每个人中。我似乎也找不到以编程方式将onClick 侦听器添加到以编程方式创建的CardView 的方法。稍后,我还希望能够通过单击按钮删除CardView

这是CardView XML 文件(在它位于相对布局之前)

<androidx.cardview.widget.CardView
    android:id="@+id/cardviewClassesBlock1"
    android:layout_width="330dp"
    android:layout_height="75dp"
    android:layout_marginTop="90dp"
    android:layout_centerHorizontal="true"
    app:cardCornerRadius="10dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/ic_launcher_background">

        <TextView
            android:id="@+id/textviewClassesBlock1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:layout_marginTop="3dp"
            android:textSize="22sp"
            android:fontFamily="@font/amiko_semibold"
            android:textColor="@color/white"
            android:text="Block A"/>

        <ImageView
            android:layout_width="60dp"
            android:layout_height="6dp"
            android:layout_marginStart="10dp"
            android:layout_below="@+id/textviewClassesBlock1"
            android:background="@drawable/rounded_corner_edittext" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="5dp"
            android:textColor="@color/white"
            android:text="P - 0 | T - 0 | A - 0"/>

    </RelativeLayout>

</androidx.cardview.widget.CardView>

【问题讨论】:

    标签: java android xml android-layout


    【解决方案1】:

    我已经为你创建了一个示例项目。

    1. 首先您必须为您的CardView 创建一个布局。在 res/layout 中创建card_base.xml。在此布局中添加:
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/cardviewClassesBlock1"
        android:layout_width="wrap_content"
        android:layout_height="75dp"
        android:layout_centerHorizontal="true"
        app:cardCornerRadius="10dp"
        android:layout_margin="10dp"
        >
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/ic_launcher_background"
            >
    
            <TextView
                android:id="@+id/textviewClassesBlock1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="3dp"
                android:text="Block A"
                android:textSize="22sp"
                />
    
            <ImageView
                android:layout_width="60dp"
                android:layout_height="6dp"
                android:layout_below="@+id/textviewClassesBlock1"
                android:layout_marginStart="10dp"
                />
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentBottom="true"
                android:layout_marginEnd="5dp"
                android:text="P - 0 | T - 0 | A - 0"
                />
    
        </RelativeLayout>
    
    </androidx.cardview.widget.CardView>
    

    这基本上是您的CardView,只是稍作改动。

    1. 接下来,在您的activity_main.xml 中添加:
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity"
        >
    
        <Button
            android:id="@+id/butAdd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Add New Card"
            />
    
        <Button
            android:id="@+id/butDoSth"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Do something"
            />
    
        <androidx.appcompat.widget.LinearLayoutCompat
            android:id="@+id/cards"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >
    
            <include
                android:id="@+id/includedLayoutFirst"
                layout="@layout/card_base"
                />
    
        </androidx.appcompat.widget.LinearLayoutCompat>
    
    </androidx.appcompat.widget.LinearLayoutCompat>
    

    这是您的应用的初始(非常简单)外观。它有一个按钮和一个已插入的 CardView。

    1. 现在在您的MainActivity.java 中粘贴此内容:
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.LinearLayoutCompat;
    import androidx.cardview.widget.CardView;
    
    public class MainActivity extends AppCompatActivity
    {
        private int starter = 66; //ASCII code for `B`
        LinearLayoutCompat cards;
        Button buttonAdd;
        Button buttonDoSth;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            cards = findViewById(R.id.cards);
            buttonAdd = findViewById(R.id.butAdd);
            buttonDoSth = findViewById(R.id.butDoSth);
    
            buttonAdd.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    CardView newCard = new CardView(MainActivity.this);
                    getLayoutInflater().inflate(R.layout.card_base, newCard);
    
                    TextView t = newCard.findViewById(R.id.textviewClassesBlock1);
    
                    String current = Character.toString((char) starter++);
    
                    t.setText("Block " + current);
                    newCard.setTag(current); //
    
                    cards.addView(newCard);
                }
            });
    
            buttonDoSth.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    findBlockAndDoSomething("B");
                }
            });
        }
    
        private void findBlockAndDoSomething(String name)
        {
            Log.d("MyTAG", "CLICK");
    
            for (int i = 0; i < cards.getChildCount(); i++)
            {
                CardView selected = (CardView) cards.getChildAt(i);
    
                if (selected.getTag() != null && selected.getTag().toString().equals(name))
                {
                    // do something. E.g change block name
                    TextView textViewClassesBlock1 = selected.findViewById(R.id.textviewClassesBlock1);
                    textViewClassesBlock1.setText("Block XXX");
                    return;
                }
            }
        }
    }
    

    结果(起始代码和添加新的 CardView):

    【讨论】:

    • 谢谢,顺便问一下,有没有办法从 java 文件中访问 TextView,上面写着“块 ___”并且位于 CardView 上?
    • Frob java文件你的意思是来自Activity类?
    • 我的意思是从 Activity 类对不起措辞不好。
    • @cg-algo 我已经编辑了我的答案。我更改了 MainActivity XML 和 java。不,您可以更改任何 CardView 中的所有内容,只需给出字母,例如B(如Block B
    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多