How to add and remove CardView from LinearLayout on button click in android studio?

余生颓废 提交于 2021-01-29 05:35:16

问题


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>

回答1:


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());

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);


In onDelete() do this:

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

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();
        }
    }
}


来源:https://stackoverflow.com/questions/51917438/how-to-add-and-remove-cardview-from-linearlayout-on-button-click-in-android-stud

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!