Archive

Archive for September, 2010

FlowLayout in Android

September 28, 2010 45 comments

This post is linked to previous post click here.
This will help you to create FlowLayout in android

Referred from here

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 *
 * @author RAW
 */
public class FlowLayout extends ViewGroup {

    private int line_height;

    public static class LayoutParams extends ViewGroup.LayoutParams {

        public final int horizontal_spacing;
        public final int vertical_spacing;

        /**
         * @param horizontal_spacing Pixels between items, horizontally
         * @param vertical_spacing Pixels between items, vertically
         */
        public LayoutParams(int horizontal_spacing, int vertical_spacing) {
            super(0, 0);
            this.horizontal_spacing = horizontal_spacing;
            this.vertical_spacing = vertical_spacing;
        }
    }

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

    public FlowLayout(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) - getPaddingLeft() - getPaddingRight();
        int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();
        final int count = getChildCount();
        int line_height = 0;

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

        int childHeightMeasureSpec;
        if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
            childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST);
        } else {
            childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
        }


        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), childHeightMeasureSpec);
                final int childw = child.getMeasuredWidth();
                line_height = Math.max(line_height, child.getMeasuredHeight() + lp.vertical_spacing);

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

                xpos += childw + lp.horizontal_spacing;
            }
        }
        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);
    }

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

    @Override
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
        if (p instanceof LayoutParams) {
            return true;
        }
        return false;
    }

    @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 = (LayoutParams) child.getLayoutParams();
                if (xpos + childw > width) {
                    xpos = getPaddingLeft();
                    ypos += line_height;
                }
                child.layout(xpos, ypos, xpos + childw, ypos + childh);
                xpos += childw + lp.horizontal_spacing;
            }
        }
    }
}

Here the xml file.

/* you must write your package name and class name */
<org.android.FlowLayout
                android:id="@+id/flow_layout"
                android:layout_marginLeft="5dip"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>

This is very useful while creating bubble.

Enjoy.. 😉 ..!!!

Advertisements
Categories: Android Tags: , ,

Android: Create bubble like facebook

September 28, 2010 4 comments

create a class named Bubble and call wherever you want to create bubble

public class Bubble extends Activity {
       /* here FlowLayout is a custom layout, i will post soon */
       /*  ArrayList subjects_list, stores string value so that there would not be duplicate names */
   public static void getBubble(String myAutoComplete, final FlowLayout flowlayout, final ArrayList subjects_list, Context c) {

   String checksubClicked = myAutoComplete;

   if (!(checksubClicked.equals(""))) {

   if (!(subjects_list.contains(checksubClicked))) {
   subjects_list.add(myAutoComplete);

   /// creates bubble button
   final Button btn = new Button(c);
   LayoutParams flowLP = new LayoutParams(5, 5);
   btn.setBackgroundDrawable(c.getResources().getDrawable(R.drawable.bubble_layout));
   btn.setPadding(6, 2, 6, 2);
   btn.setTextSize(14);
   btn.setSingleLine(true);
   btn.setEllipsize(TruncateAt.END);
   btn.setTextColor(Color.BLACK);
   /// sets the text
   btn.setText(myAutoComplete + "  ");
   Resources res = c.getResources();
   Drawable image = res.getDrawable(R.drawable.bubble_input_close);
   /// sets the image to right
   btn.setCompoundDrawablesWithIntrinsicBounds(null, null, image, null);

   btn.setOnClickListener(new View.OnClickListener() {

   public void onClick(View arg0) {
   /// deletes bubble
   subjects_list.remove(btn.getText().toString().substring(0, btn.getText().toString().length() - 1).trim());
   /// this is to remove button from layout
   flowlayout.removeView(arg0);
   }
   });
    // flowLP is related to FlowLayout
   flowlayout.addView(btn, flowLP);
   }
   }
   }
}

In class where you want to create a bubble add
ArrayList subjects_list = new ArrayList();
FlowLayout flowlayout = (FlowLayout) findViewById(R.id.flow_layout);

Bubble.getBubble(stringValue, flowlayout, subjects_list,c);
here c is Context.

Here the xml file which contains the design of bubble named bubble_layout.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape      xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">

<solid   android:color="#EAEAEA"/>

<corners    android:bottomLeftRadius="3dip"
            android:topRightRadius="3dip"
            android:topLeftRadius="3dip"
            android:bottomRightRadius="3dip"
            />

</shape>

your bubble is ready

Enjoy.. 😉 ..!!!

Categories: Android Tags: ,
%d bloggers like this: