Caesar Krit
Caesar Krit

Reputation: 214

removeViewAt using an id and onclickListener

i am trying to dynamically create a taglayout using an onclickbutton which works fine. on creating this taglayout i give it and an image the same id. later when i click the image i get the id of the taglayout and i want to remove it. it just doesnt seem to work. here is my main.

////////////////////bottom one works fine. just when i try to delete the last element i get "Attempt to invoke virtual method 'void android.view.View.unFocus(android.view.View)' on a null object reference"

and the app crashes

public class MainActivity extends Activity implements View.OnClickListener {

final String TAG = "testingProject";

Button add;
EditText interest;
String stuff;
ImageView imgFavorite;
int id = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //inititzlaizzzzzzzzzzzzeeeeeeeeeeee this shit view or something

    interest = (EditText) findViewById(R.id.interest);
    add = (Button) findViewById(R.id.add);
    add.setOnClickListener(this);


}
public void onClick(View v) {
    if(v==add)
    {

        stuff = interest.getText().toString();
        final TagLayout tagLayout = (TagLayout) findViewById(R.id.tagLayout);
        LayoutInflater layoutInflater = getLayoutInflater();
        View tagView = layoutInflater.inflate(R.layout.tag_layout, null, false);


        final TextView tagTextView = (TextView) tagView.findViewById(R.id.tagTextView);
        imgFavorite = (ImageView) tagView.findViewById(R.id.imageView);


        imgFavorite.setId(id);
        tagTextView.setId(id);

        tagTextView.setText(stuff);

        imgFavorite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                Log.i(TAG, "this is id" + v.getId());
                tagLayout.removeViewAt(v.getId());
                //tagLayout.removeViewAt(getTaskId());
            }
        });

        tagLayout.addView(tagView);

        Log.i(TAG, "first id given" + id);

        id = id + 1;

      //  Log.i(TAG,"this id is" + id);


    };
}

} //tagLayout

import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;


public class TagLayout extends ViewGroup {
    int deviceWidth;
    int id = 0;

    public TagLayout(Context context) {
        this(context, null, 0);
    }

    public TagLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TagLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public void init(Context context) {
        final Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        Point deviceDisplay = new Point();
        display.getSize(deviceDisplay);
        deviceWidth = deviceDisplay.x;
    }

    /*public void addView(View child,ViewGroup.LayoutParams params) {
        child.setId(id);
        id++;
    }*/

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        final int count = getChildCount();
        int curWidth, curHeight, curLeft, curTop, maxHeight;

        //get the available size of child view
        final int childLeft = this.getPaddingLeft();
        final int childTop = this.getPaddingTop();
        final int childRight = this.getMeasuredWidth() - this.getPaddingRight();
        final int childBottom = this.getMeasuredHeight() - this.getPaddingBottom();
        final int childWidth = childRight - childLeft;
        final int childHeight = childBottom - childTop;

        maxHeight = 0;
        curLeft = childLeft;
        curTop = childTop;

        for (int i = 0; i < count; i++) {
            View child = getChildAt(i);

            if (child.getVisibility() == GONE)
                return;

            //Get the maximum size of the child
            child.measure(MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.AT_MOST));
            curWidth = child.getMeasuredWidth();
            curHeight = child.getMeasuredHeight();
            //wrap is reach to the end
            if (curLeft + curWidth >= childRight) {
                curLeft = childLeft;
                curTop += maxHeight;
                maxHeight = 0;
            }
            //do the layout
            child.layout(curLeft, curTop, curLeft + curWidth, curTop + curHeight);
            //store the max height
            if (maxHeight < curHeight)
                maxHeight = curHeight;
            curLeft += curWidth;
        }
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int count = getChildCount();
        // Measurement will ultimately be computing these values.
        int maxHeight = 0;
        int maxWidth = 0;
        int childState = 0;
        int mLeftWidth = 0;
        int rowCount = 0;

        // Iterate through all children, measuring them and computing our dimensions
        // from their size.
        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);

            if (child.getVisibility() == GONE)
                continue;

            // Measure the child.
            measureChild(child, widthMeasureSpec, heightMeasureSpec);
            maxWidth += Math.max(maxWidth, child.getMeasuredWidth());
            mLeftWidth += child.getMeasuredWidth();

            if ((mLeftWidth / deviceWidth) > rowCount) {
                maxHeight += child.getMeasuredHeight();
                rowCount++;
            } else {
                maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
            }
            childState = combineMeasuredStates(childState, child.getMeasuredState());
        }

        // Check against our minimum height and width
        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());

        // Report our final dimensions.
        setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
                resolveSizeAndState(maxHeight, heightMeasureSpec, childState << MEASURED_HEIGHT_STATE_SHIFT));
    }
}

// tag_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tagTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="#a000"
        android:padding="10dp"
        android:textColor="#fff"
        android:onClick="onClick"
        android:clickable="true" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:src="@drawable/takeout"
        android:layout_alignRight="@+id/tagTextView"/>



</LinearLayout>

//activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.javatechig.taglayout.TagLayout
        android:id="@+id/tagLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="change"
        android:id="@+id/add"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/interest"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />


</RelativeLayout>

Upvotes: 1

Views: 550

Answers (1)

Caleb
Caleb

Reputation: 1706

As I understand it, you want to know how to

  1. Show the TagLayout when the button is pressed
  2. Remove the TagLayout when the Image (inside the tagLayout) is pressed

I copied your code in an empty project and then I created a default TagLayout of my own. It just extends LinearLayout.

public class TagLayout extends LinearLayout { ...

EDIT: Now I am using your layout files.

I replicated your Activity code but made some small changes.

public class RemoveTagActivity extends Activity implements View.OnClickListener {

    final String TAG = "testingProject";

    Button add;
    EditText interest;
    String stuff;
    ImageView imgFavorite;
    int id = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_remove_tag);

        interest = (EditText) findViewById(R.id.interest);
        add = (Button) findViewById(R.id.add);
        add.setOnClickListener(this);
    }

    @SuppressWarnings("ResourceType")
    public void onClick(View v) {
        if (v == add) {

            // Read the edit text
            stuff = interest.getText().toString();

            // Inflate the tag layout
            LayoutInflater layoutInflater = getLayoutInflater();
            final ViewGroup root = (ViewGroup) findViewById(android.R.id.content);


            final View tagView = layoutInflater.inflate(R.layout.tag_layout, root, false);
            root.addView(tagView);

            // Get access to the subviews of Tag View
            final TextView tagTextView = (TextView) tagView.findViewById(R.id.tagTextView);
            imgFavorite = (ImageView) tagView.findViewById(R.id.imageView);

            // Set their id's to 1
            imgFavorite.setId(id);
            tagTextView.setId(id);

            tagTextView.setText(stuff);

            imgFavorite.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Remove the Tag Layout
                    ((ViewGroup) tagView.getParent()).removeView(tagView);
                }
            });

            Log.i(TAG, "first id given" + id);

            id = id + 1;

            Log.i(TAG, "this id is" + id);


        }
    }
}

Upvotes: 1

Related Questions