如何在Android Studio中单击按钮时从LinearLayout中添加和删除CardView? [英] How to add and remove CardView from LinearLayout on button click in android studio?

查看:102
本文介绍了如何在Android Studio中单击按钮时从LinearLayout中添加和删除CardView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个线性布局,其中包含cardView.我想在单击按钮时动态添加和删除cardViews.我尝试了以下代码,但是删除按钮在添加新的动态填充视图更改后仍然无法正常工作,如下图所示.

I have a linear layout that contains a cardView. I want to add and delete cardViews dynamically on button clicks. I have tried the following code but the delete button doesn't work moreover the padding of dynamically added view changes on its own after adding a new as shown in picture below.

ExperienceInfoActivity.java

package kbg.com.kbgpos.forms;
import android.app.DatePickerDialog;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.CardView;
import android.support.v7.widget.Toolbar;
import android.text.format.Time;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;

import kbg.com.kbgpos.R;

public class ExperienceInfoActivity extends AppCompatActivity {
    Toolbar toolbar;
    private LinearLayout parentRelativeLayout;
    private View v;
    EditText fromDateEditText,toDateEditText;
    private ViewGroup.LayoutParams params;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_experience_info);
        initViews();
        initListeners();
    }


    private void initViews() {
        toolbar=(Toolbar) findViewById(R.id.toolbarExperienceInfoActivity);
        toolbar.setTitle("Employee Experience Info");
        toolbar.setTitleTextColor(getResources().getColor(R.color.toolBarTitle));
        toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_black_24dp));
        setSupportActionBar(toolbar);

        parentRelativeLayout = (LinearLayout) findViewById(R.id.experienceDetailsInfoRelLayout);
        CardView experienceInfoActivityFormCardVw = findViewById(R.id.experienceInfoActivityFormCardVw);
        ImageView delRowBtn = findViewById(R.id.delRowBtn);
        delRowBtn.setTag(experienceInfoActivityFormCardVw);
        params = experienceInfoActivityFormCardVw.getLayoutParams();
        fromDateEditText=(EditText)findViewById(R.id.fromDateEditText);
        toDateEditText=(EditText)findViewById(R.id.toDateEditText);
    }

    private void initListeners() {
        fromDateEditText.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP) {
                    if(event.getRawX() >= fromDateEditText.getRight() - fromDateEditText.getTotalPaddingRight()) {
                        DatePickerDialog.OnDateSetListener dpd = new DatePickerDialog.OnDateSetListener() {
                            @Override
                            public void onDateSet(DatePicker view, int year, int monthOfYear,
                                                  int dayOfMonth) {

                                int s=monthOfYear+1;
                                String a = dayOfMonth+"/"+s+"/"+year;
                                fromDateEditText.setText(""+a);
                            }
                        };

                        Time date = new Time();
                        DatePickerDialog d = new DatePickerDialog(ExperienceInfoActivity.this, dpd, date.year ,date.month, date.monthDay);
                        d.show();

                        return true;
                    }
                }
                return true;
            }
        });

        toDateEditText.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP) {
                    if(event.getRawX() >= toDateEditText.getRight() - toDateEditText.getTotalPaddingRight()) {
                        DatePickerDialog.OnDateSetListener dpd = new DatePickerDialog.OnDateSetListener() {
                            @Override
                            public void onDateSet(DatePicker view, int year, int monthOfYear,
                                                  int dayOfMonth) {

                                int s=monthOfYear+1;
                                String a = dayOfMonth+"/"+s+"/"+year;
                                toDateEditText.setText(""+a);
                            }
                        };

                        Time date = new Time();
                        DatePickerDialog d = new DatePickerDialog(ExperienceInfoActivity.this, dpd, date.year ,date.month, date.monthDay);
                        d.show();

                        return true;
                    }
                }
                return true;
            }
        });
    }

    public void onAddField(View view) {
        try{

            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            final View rowView = inflater.inflate(R.layout.experience_details_row, null);
            if(parentRelativeLayout.getChildCount()>1){
                ViewGroup parent = (ViewGroup) view.getParent();
                parent.removeView(view);
            }
            ImageView delRowBtn = rowView.findViewById(R.id.delRowBtn);
            delRowBtn.setTag(rowView);
            rowView.setLayoutParams(params);
            parentRelativeLayout.addView(rowView, parentRelativeLayout.getChildCount());
            EditText employerNameEditText = rowView.findViewById(R.id.employerNameEditText);
            employerNameEditText.requestFocus();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public void onDelete(View v) {
        try{
            if(parentRelativeLayout.getChildCount()>2) {
                CardView cv = (CardView) ((ImageView) v).getTag();
                parentRelativeLayout.removeView(cv);
            }else{
                ViewGroup parent = (ViewGroup) v.getParent();
                v.setBackgroundColor(getResources().getColor(R.color.material_grey_50));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

experience_details_row.xml

<?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/experienceInfoActivityFormCardVw"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:layout_marginTop="5dp"
        card_view:cardElevation="2dp"
        card_view:contentPadding="5dp"
        card_view:cardCornerRadius="2dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.design.widget.TextInputLayout
                android:id="@+id/employerNameTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:hintTextAppearance="@style/text_in_layout_hint_Style"
                app:errorTextAppearance="@style/text_in_layout_error_hint_Style">
                <EditText
                    android:id="@+id/employerNameEditText"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:ems="10"
                    android:textSize="12sp"
                    android:inputType="textPersonName"
                    android:hint="Employer Name" />
            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:id="@+id/designationTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                app:hintTextAppearance="@style/text_in_layout_hint_Style"
                app:errorTextAppearance="@style/text_in_layout_error_hint_Style"
                android:layout_below="@id/employerNameTextInputLayout">
                <EditText
                    android:id="@+id/designationEditText"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:ems="10"
                    android:textSize="12sp"
                    android:inputType="textPersonName"
                    android:hint="Designation" />
            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:id="@+id/addressTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                app:hintTextAppearance="@style/text_in_layout_hint_Style"
                app:errorTextAppearance="@style/text_in_layout_error_hint_Style"
                android:layout_below="@id/designationTextInputLayout">
                <EditText
                    android:id="@+id/addressEditText"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:ems="10"
                    android:textSize="12sp"
                    android:inputType="textPersonName"
                    android:hint="Address" />
            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:id="@+id/fromDateTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                app:hintTextAppearance="@style/text_in_layout_hint_Style"
                app:errorTextAppearance="@style/text_in_layout_error_hint_Style"
                android:layout_below="@id/addressTextInputLayout">
                <EditText
                    android:id="@+id/fromDateEditText"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:textSize="12sp"
                    android:inputType="date"
                    android:drawableRight="@drawable/ic_perm_contact_calendar_black_24dp"
                    android:drawableTint="@android:color/holo_orange_light"
                    android:hint="From Date" />
            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:id="@+id/toDateTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                app:hintTextAppearance="@style/text_in_layout_hint_Style"
                app:errorTextAppearance="@style/text_in_layout_error_hint_Style"
                android:layout_below="@id/fromDateTextInputLayout">
                <EditText
                    android:id="@+id/toDateEditText"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:textSize="12sp"
                    android:inputType="date"
                    android:hint="To Date"
                    android:drawableRight="@drawable/ic_perm_contact_calendar_black_24dp"
                    android:drawableTint="@android:color/holo_orange_light"/>
            </android.support.design.widget.TextInputLayout>
            <LinearLayout
                android:id="@+id/addDelLayout"
                android:layout_marginTop="5dp"
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="left"
                android:orientation="horizontal"
                android:layout_below="@id/toDateTextInputLayout">
                <ImageView
                    android:id="@+id/addRowBtn"
                    android:src="@drawable/ic_add_box_black_24dp"
                    android:layout_width="40dp"
                    android:layout_height="30dp"
                    android:onClick="onAddField"
                    android:background="@android:color/holo_green_light"
                    android:layout_marginRight="30dp"/>
                <ImageView
                    android:id="@+id/delRowBtn"
                    android:src="@drawable/ic_delete_black_24dp"
                    android:background="@android:color/holo_red_dark"
                    android:layout_width="40dp"
                    android:layout_height="30dp"
                    android:onClick="onDelete"/>
            </LinearLayout>
        </RelativeLayout>
    </android.support.v7.widget.CardView>

activity_experience_info.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".forms.ExperienceInfoActivity">

    <include
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        layout="@layout/toolbar_layout"
        android:id="@+id/toolbarExperienceInfoActivity"></include>

    <ScrollView
        android:id="@+id/personalDetailScroll"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:fillViewport="true"
        android:layout_marginBottom="55dp"
        android:scrollbars = "vertical"
        android:layout_below="@id/toolbarExperienceInfoActivity">

        <LinearLayout
            android:id="@+id/experienceDetailsInfoRelLayout"
            android:padding="5dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
        <android.support.v7.widget.CardView
            android:id="@+id/experienceInfoActivityFormHeadingCardVw"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="10dp"
            card_view:cardElevation="2dp"
            card_view:contentPadding="5dp"
            card_view:cardCornerRadius="2dp"
            app:cardBackgroundColor="@android:color/holo_orange_light">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Experience Details"
                android:textStyle="bold"
                android:textColor="@android:color/white"
                android:layout_gravity="center"/>
        </android.support.v7.widget.CardView>
            <android.support.v7.widget.CardView
                android:id="@+id/experienceInfoActivityFormCardVw"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:layout_marginBottom="5dp"
                android:layout_marginTop="5dp"
                card_view:cardElevation="2dp"
                card_view:contentPadding="5dp"
                card_view:cardCornerRadius="2dp">

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <android.support.design.widget.TextInputLayout
                        android:id="@+id/employerNameTextInputLayout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hintTextAppearance="@style/text_in_layout_hint_Style"
                        app:errorTextAppearance="@style/text_in_layout_error_hint_Style">
                        <EditText
                            android:id="@+id/employerNameEditText"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:ems="10"
                            android:textSize="12sp"
                            android:inputType="textPersonName"
                            android:hint="Employer Name" />
                    </android.support.design.widget.TextInputLayout>

                    <android.support.design.widget.TextInputLayout
                        android:id="@+id/designationTextInputLayout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="10dp"
                        app:hintTextAppearance="@style/text_in_layout_hint_Style"
                        app:errorTextAppearance="@style/text_in_layout_error_hint_Style"
                        android:layout_below="@id/employerNameTextInputLayout">
                        <EditText
                            android:id="@+id/designationEditText"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:ems="10"
                            android:textSize="12sp"
                            android:inputType="textPersonName"
                            android:hint="Designation" />
                    </android.support.design.widget.TextInputLayout>

                    <android.support.design.widget.TextInputLayout
                        android:id="@+id/addressTextInputLayout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="10dp"
                        app:hintTextAppearance="@style/text_in_layout_hint_Style"
                        app:errorTextAppearance="@style/text_in_layout_error_hint_Style"
                        android:layout_below="@id/designationTextInputLayout">
                        <EditText
                            android:id="@+id/addressEditText"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:ems="10"
                            android:textSize="12sp"
                            android:inputType="textPersonName"
                            android:hint="Address" />
                    </android.support.design.widget.TextInputLayout>

                    <android.support.design.widget.TextInputLayout
                        android:id="@+id/fromDateTextInputLayout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="10dp"
                        app:hintTextAppearance="@style/text_in_layout_hint_Style"
                        app:errorTextAppearance="@style/text_in_layout_error_hint_Style"
                        android:layout_below="@id/addressTextInputLayout">
                        <EditText
                            android:id="@+id/fromDateEditText"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:textSize="12sp"
                            android:inputType="date"
                            android:drawableRight="@drawable/ic_perm_contact_calendar_black_24dp"
                            android:drawableTint="@android:color/holo_orange_light"
                            android:hint="From Date" />
                    </android.support.design.widget.TextInputLayout>

                    <android.support.design.widget.TextInputLayout
                        android:id="@+id/toDateTextInputLayout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="10dp"
                        app:hintTextAppearance="@style/text_in_layout_hint_Style"
                        app:errorTextAppearance="@style/text_in_layout_error_hint_Style"
                        android:layout_below="@id/fromDateTextInputLayout">
                        <EditText
                            android:id="@+id/toDateEditText"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:textSize="12sp"
                            android:inputType="date"
                            android:hint="To Date"
                            android:drawableRight="@drawable/ic_perm_contact_calendar_black_24dp"
                            android:drawableTint="@android:color/holo_orange_light"/>
                    </android.support.design.widget.TextInputLayout>
                    <LinearLayout
                        android:id="@+id/addDelLayout"
                        android:layout_marginTop="5dp"
                        android:padding="5dp"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="left"
                        android:orientation="horizontal"
                        android:layout_below="@id/toDateTextInputLayout">
                        <ImageView
                            android:id="@+id/addRowBtn"
                            android:src="@drawable/ic_add_box_black_24dp"
                            android:layout_width="40dp"
                            android:layout_height="30dp"
                            android:onClick="onAddField"
                            android:background="@android:color/holo_green_light"
                            android:layout_marginRight="30dp"/>
                        <ImageView
                            android:id="@+id/delRowBtn"
                            android:src="@drawable/ic_delete_black_24dp"
                            android:background="@android:color/holo_red_dark"
                            android:layout_width="40dp"
                            android:layout_height="30dp"
                            android:onClick="onDelete"/>
                    </LinearLayout>
                </RelativeLayout>
            </android.support.v7.widget.CardView>
        </LinearLayout>

    </ScrollView>

    <LinearLayout
        android:layout_alignParentBottom="true"
        android:elevation="4dp"
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:padding="5dp"
        android:weightSum="2"
        android:orientation="horizontal"
        android:gravity="center">

        <Button
            android:id="@+id/cancelBtn"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="45dp"
            android:text="CANCEL"
            android:background="#e0e0e0"
            android:textStyle="bold"
            android:textColor="@android:color/white"/>
        <Button
            android:id="@+id/saveBtn"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="45dp"
            android:text="SUBMIT"
            android:background="#ffe57f"
            android:textStyle="bold"
            android:textColor="@android:color/white"/>
    </LinearLayout>
</RelativeLayout>

推荐答案

onDelete(View v)中的参数 v 不是 CardView 您要删除.
这是您单击的 ImageView .
onAddField()中执行以下操作:

The parameter v in onDelete(View v) is not the CardView that you want to be removed.
It's the ImageView that you click.
In onAddField() do this:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View rowView = inflater.inflate(R.layout.experience_details_row, null);
ImageView delRowBtn = rowView.findViewById(R.id.delRowBtn);
delRowBtn.setTag(rowView);
parentRelativeLayout.addView(rowView, parentRelativeLayout.getChildCount());

上面的代码所做的是将新的 CardView 对象存储在 delRowBtn 的标签中.
我还从 parentRelativeLayout.getChildCount()中删除了 -1 ,以在末尾添加新的CardView.
但是上述逻辑也必须应用于已经存在的第一个 CardView ,因此在 onCreate()中添加以下内容:

what the above code does is store the new CardView object in delRowBtn's tag.
Also I removed -1 from parentRelativeLayout.getChildCount() to add the new CardView at the end.
But the above logic must be applied also to the 1st CardView that is already there, so in onCreate() add this:

CardView experienceInfoActivityFormCardVw = findViewById(R.id.experienceInfoActivityFormCardVw);
ImageView delRowBtn = findViewById(R.id.delRowBtn);
delRowBtn.setTag(experienceInfoActivityFormCardVw);


onDelete()中执行以下操作:


In onDelete() do this:

CardView cv = (CardView) ((ImageView) v).getTag();
parentRelativeLayout.removeView(cv);

上面的代码所做的是从 delRowBtn 的标签中检索 CardView 对象,并将其从 parentRelativeLayout 中删除.

what the above code does is retrieves the CardView object from delRowBtn's tag and removes it from parentRelativeLayout.

您的活动的完整代码:

The full code of your Activity:

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.CardView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class ExperienceInfoActivity extends AppCompatActivity {
    Toolbar toolbar;
    private LinearLayout parentRelativeLayout;
    private ViewGroup.LayoutParams params;
    private int count = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_experience_info);

        CardView experienceInfoActivityFormCardVw = findViewById(R.id.experienceInfoActivityFormCardVw);
        ImageView delRowBtn = findViewById(R.id.delRowBtn);
        delRowBtn.setTag(experienceInfoActivityFormCardVw);
        params = experienceInfoActivityFormCardVw.getLayoutParams();

        initViews();
        initListeners();
    }

    private void initListeners() {

    }

    private void initViews() {
        toolbar=(Toolbar) findViewById(R.id.toolbarExperienceInfoActivity);
        toolbar.setTitle("Employee Experience Info");
        toolbar.setTitleTextColor(getResources().getColor(R.color.toolBarTitle));
        toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_black_24dp));
        setSupportActionBar(toolbar);

        parentRelativeLayout = (LinearLayout) findViewById(R.id.experienceDetailsInfoRelLayout);
    }

    public void onAddField(View view) {
        try{
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            final View rowView = inflater.inflate(R.layout.experience_details_row, null);
            ImageView delRowBtn = rowView.findViewById(R.id.delRowBtn);
            delRowBtn.setTag(rowView);
            rowView.setLayoutParams(params);
            parentRelativeLayout.addView(rowView, parentRelativeLayout.getChildCount());
            EditText employerNameEditText = rowView.findViewById(R.id.employerNameEditText);
            employerNameEditText.requestFocus();
            count++;
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public void onDelete(View v) {
        try{
            if (count == 1) return;
            CardView cv = (CardView) ((ImageView) v).getTag();
            parentRelativeLayout.removeView(cv);
            count--;

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

这篇关于如何在Android Studio中单击按钮时从LinearLayout中添加和删除CardView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆