Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用onclick方法以编程方式添加多个CardView_Java_Android_Xml_Android Layout - Fatal编程技术网

Java 使用onclick方法以编程方式添加多个CardView

Java 使用onclick方法以编程方式添加多个CardView,java,android,xml,android-layout,Java,Android,Xml,Android Layout,我还是Android新手,每次点击一个按钮,我都想在活动中添加一个cardwiew。cardwiew上有文本和背景图像。我已经有了可以添加这个的XML文件,但是因为我希望能够添加多个,所以我不能使用。第一个图像是单击按钮一次时的图像,第二个图像是单击按钮三次时的图像。我已经为TextView设置了onClick,上面写着“单击以添加块”,为cardwiew设置了XML,但是我不能这样做,以便您可以添加它们,并在每个视图中更改TextView中的文本。我似乎也找不到一种方法可以通过编程将onCli

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

这是
cardwiew
XML文件(在它进入相对布局之前)


我为您创建了一个示例项目

  • 首先,您必须为
    CardView
    创建布局。在res/layout中创建
    card\u base.xml
    。在此布局中添加:
  • 这是你的应用程序的入门(非常简单)外观。它有一个按钮和一个已插入的CardView

  • 现在在
    MainActivity.java中粘贴以下内容:
  • 导入android.os.Bundle;
    导入android.util.Log;
    导入android.view.view;
    导入android.widget.Button;
    导入android.widget.TextView;
    导入androidx.appcompat.app.appcompat活动;
    导入androidx.appcompat.widget.LinearLayoutCompat;
    导入androidx.cardwiew.widget.cardwiew;
    公共类MainActivity扩展了AppCompatActivity
    {
    private int starter=66;//用于'B'的ASCII代码`
    线性布局海外同胞卡;
    按钮D;
    钮扣;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    卡片=findViewById(R.id.cards);
    ButtonAd=findViewById(R.id.butAdd);
    ButtonToSth=findViewById(R.id.Butdosh);
    ButtonAd.setOnClickListener(新视图.OnClickListener()
    {
    @凌驾
    公共void onClick(视图v)
    {
    CardView newCard=新的CardView(MainActivity.this);
    GetLayoutFlater().充气(R.layout.card_底座,新卡);
    TextView t=newCard.findViewById(R.id.textviewClassesBlock1);
    字符串电流=Character.toString((char)starter++);
    t、 setText(“块”+电流);
    newCard.setTag(当前)//
    addView(newCard);
    }
    });
    setOnClickListener(newview.OnClickListener())
    {
    @凌驾
    公共void onClick(视图v)
    {
    查找块和数据集(“B”);
    }
    });
    }
    私有void findBlockAndDoSomething(字符串名称)
    {
    Log.d(“我的标签”,“点击”);
    对于(int i=0;i
    结果(起动机代码和添加新的CardView):


    谢谢,顺便问一下,是否有任何方法可以访问java文件中显示“Block”
    CardView
    TextView
    ?您指的是活动类中的java文件?我是指活动类中的文件?对不起,措辞不正确。@cg algo我编辑了我的答案。我改变了XML和java。不,您可以更改任何卡片视图中的所有内容,只需给出字母,例如
    B
    (如
    块B
    <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>
    
    <?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>
    
    <?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>
    
    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;
                }
            }
        }
    }