Я хочу удалить изображение, которое было недавно добавлено, если кто-нибудь нажмет кнопку минус.

Я добавил изображение одно за другим при нажатии кнопки плюс.

Можно увидеть на снимке введите описание изображения здесь

При нажатии кнопки плюс изображения будут добавляться по одному.

Хочу удалить по нажатию кнопки минус недавно добавленное изображение.

           image.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.N)
            @Override
            public void onClick(View v) {
            ImageView image = new ImageView(Water.this);
            image.setBackgroundResource(R.drawable.glass);
                predicate.addView(image);



        }
        });

        ImageView minus=(ImageView)findViewById(R.id.minus);
        minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ImageView image = new ImageView(Water.this);
                image.setImageBitmap(null);
                predicate.removeView(image);
                //image.setBackgroundResource(R.drawable.glass);
                //((ViewGroup) image.getParent()).removeView(image);
                //predicate.removeView(image);
            }
        }); 

XML

<TextView
            android:id="@+id/waterdescription"
            android:text="Water Intake"
            android:textSize="16dp"
            android:layout_weight="1"
            android:layout_marginLeft="20dp"
            android:layout_width="wrap_content"
            android:textColor="#283D65"
            android:textStyle="bold"
            android:layout_height="wrap_content"

            />

        <ImageView
            android:id="@+id/minus"
            android:layout_weight="1"
            android:layout_toRightOf="@+id/waterdescription"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/minus"
            />

        <ImageView
            android:id="@+id/image"
            android:layout_weight="1"
            android:layout_alignParentRight="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/plus"
            />

Макет предиката

public class PredicateLayout extends ViewGroup {

    private int line_height;

    public PredicateLayout(Context context) {
        super(context);
    }

    public PredicateLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        assert (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED);

        final int width = MeasureSpec.getSize(widthMeasureSpec);

        // The next line is WRONG!!! Doesn't take into account requested MeasureSpec mode!
        int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();
        final int count = getChildCount();
        int line_height = 0;

        int xpos = getPaddingLeft();
        int ypos = getPaddingTop();

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                final LayoutParams lp = child.getLayoutParams();
                child.measure(
                        MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
                        MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED));

                final int childw = child.getMeasuredWidth();
                line_height = Math.max(line_height, child.getMeasuredHeight() + lp.height);

                if (xpos + childw > width) {
                    xpos = getPaddingLeft();
                    ypos += line_height;
                }

                xpos += childw + lp.width + 8;
            }
        }
        this.line_height = line_height;

        if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) {
            height = ypos + line_height;

        } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
            if (ypos + line_height < height) {
                height = ypos + line_height;
            }
        }
        setMeasuredDimension(width, height + 20);
    }

    @Override
    protected LayoutParams generateDefaultLayoutParams() {
        return new LayoutParams(2, 2); // default of 1px spacing
    }

    @Override
    protected boolean checkLayoutParams(LayoutParams p) {
        return (p instanceof LayoutParams);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        final int count = getChildCount();
        final int width = r - l;
        int xpos = getPaddingLeft();
        int ypos = getPaddingTop();

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                final int childw = child.getMeasuredWidth();
                final int childh = child.getMeasuredHeight();
                final LayoutParams lp =  child.getLayoutParams();
                if (xpos + childw > width) {
                    xpos = getPaddingLeft();
                    ypos += line_height;
                }
                child.layout(xpos, ypos, xpos + childw, ypos + childh);
                xpos += childw + lp.width + 8;
            }
        }
    }
}
1
Jacks 24 Апр 2017 в 15:59

2 ответа

Лучший ответ

Вы не ссылаетесь на изображение, добавленное вами в методе onClick () кнопки «плюс».

minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ImageView image = new ImageView(Water.this);
                image.setImageBitmap(null);
                predicate.removeView(image);
                //image.setBackgroundResource(R.drawable.glass);
                //((ViewGroup) image.getParent()).removeView(image);
                //predicate.removeView(image);
            }
        });

ImageView image = new ImageView (Water.this); в этой строке вы создаете новый ImageView с водой и пытаетесь удалить его из родительского макета. Но ты даже не добавил это.

Вам нужно сохранить ссылку на представления, которые вы добавляете, в методе onClick () кнопки plus.

Вы можете сделать что-то вроде:

public class PredicateLayout extends ViewGroup {
   private LinkedList<ImageView> imageViews;

   //other parts are omitted...

   public PredicateLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        imageViews = new LinkedList();
    }

   //...some other code...

   public LinkedList<ImageView> getImageViews(){
        return imageViews;
   }
}

И при добавлении:

Кнопка плюс:

...onClick() {
   //..
   predicate.addView(image);
   predicate.getImageViews().add(image);

}

Кнопка минус:

...onClick(){
  //pollLast returns last element in the list 
  ImageView lastAddedImageView = predicate.getImageViews().pollLast() 

  predicate.removeView(lastAddedImageView);
}
1
gizembrh 24 Апр 2017 в 13:27

Добавить вид как:

        ImageView image = new ImageView(Water.this);
        image.setId(Integer.parseInt("1234"));
        image.setBackgroundResource(R.drawable.glass);

        predicate.addView(image);

И удали это:

    View rView=(ImageView)view.findViewById(Integer.parseInt("1234"));
    predicate.removeView(rView);
0
Divyesh Patel 24 Апр 2017 в 13:28