package com.beardedhen.androidbootstrap; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; import com.hoollyzhang.hlib.R; public class BootstrapButton extends FrameLayout { private TextView lblMiddle; private TextView lblRight; private TextView lblLeft; private ViewGroup layout; private boolean roundedCorners = false; private enum BootstrapType { DEFAULT("default", R.drawable.bbuton_default, R.drawable.bbuton_default_rounded, R.color.black), PRIMARY("primary", R.drawable.bbuton_primary, R.drawable.bbuton_primary_rounded, R.color.white), SUCCESS("success", R.drawable.bbuton_success, R.drawable.bbuton_success_rounded, R.color.white), INFO("info", R.drawable.bbuton_info, R.drawable.bbuton_info_rounded, R.color.white), WARNING("warning", R.drawable.bbuton_warning, R.drawable.bbuton_warning_rounded, R.color.white), DANGER("danger", R.drawable.bbuton_danger, R.drawable.bbuton_danger_rounded, R.color.white), INVERSE("inverse", R.drawable.bbuton_inverse, R.drawable.bbuton_inverse_rounded, R.color.white); private final String type; private final int normalBg; private final int roundedBg; private final int textColour; BootstrapType(String type, int normalBg, int roundedBg, int textColour) { this.type = type; this.normalBg = normalBg; this.roundedBg = roundedBg; this.textColour = textColour; } public static BootstrapType getBootstrapTypeFromString(String type) { for (BootstrapType value : BootstrapType.values()) { if (value.type.equals(type)) { return value; } } return DEFAULT; } public int getTextColour() { return textColour; } public int getRoundedBg() { return roundedBg; } public int getNormalBg() { return normalBg; } } private enum BootstrapSize { LARGE("large", 20.0f, 15, 20), DEFAULT("default", 14.0f, 10, 15), SMALL("small", 12.0f, 5, 10), XSMALL("xsmall", 10.0f, 2, 5); private final float fontSize; private final String type; private final int paddingA; private final int paddingB; private BootstrapSize(String type, float fontSize, int paddingA, int paddingB) { this.type = type; this.fontSize = fontSize; this.paddingA = paddingA; this.paddingB = paddingB; } public float getFontSize() { return fontSize; } public static BootstrapSize getBootstrapSizeFromString(String size) { for (BootstrapSize value : BootstrapSize.values()) { if (value.type.equals(size)) { return value; } } return DEFAULT; } } public BootstrapButton(Context context) { super(context); initialise(null); } public BootstrapButton(Context context, AttributeSet attrs) { super(context, attrs); initialise(attrs); } public BootstrapButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initialise(attrs); } private void initialise(AttributeSet attrs) { LayoutInflater inflater = LayoutInflater.from(getContext()); float fontSize = FontAwesome.DEFAULT_FONT_SIZE; float scale = getResources().getDisplayMetrics().density; //for padding int paddingA; int paddingB; TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.BootstrapButton); String iconLeft = ""; String iconRight = ""; String text = ""; String gravity = ""; String size = "default"; String bootstrapStringType = "default"; boolean enabled = true; try { if (a != null) { bootstrapStringType = a.getString(R.styleable.BootstrapButton_bb_type); bootstrapStringType = (bootstrapStringType == null) ? "default" : bootstrapStringType; // icons iconLeft = a.getString(R.styleable.BootstrapButton_bb_icon_left); iconLeft = (iconLeft == null) ? "" : iconLeft; iconRight = a.getString(R.styleable.BootstrapButton_bb_icon_right); iconRight = (iconRight == null) ? "" : iconRight; // text text = a.getString(R.styleable.BootstrapButton_android_text); text = (text == null) ? "" : text; gravity = a.getString(R.styleable.BootstrapButton_bb_text_gravity); gravity = (gravity == null) ? "" : gravity; // size size = a.getString(R.styleable.BootstrapButton_bb_size); size = (size == null) ? "default" : size; int layoutWidth = a.getLayoutDimension(R.styleable.BootstrapButton_android_layout_width, 0); boolean fillparent = (layoutWidth == LayoutParams.MATCH_PARENT); Float layoutWeight = a.getFloat(R.styleable.BootstrapButton_android_layout_weight, -1); fillparent = (layoutWeight != -1) || fillparent; roundedCorners = a.getBoolean(R.styleable.BootstrapButton_bb_roundedCorners, false); enabled = a.getBoolean(R.styleable.BootstrapButton_android_enabled, true); if (a.getString(R.styleable.BootstrapButton_android_textSize) != null) { float scaledDensity = getContext().getResources().getDisplayMetrics().scaledDensity; float defaultDimen = FontAwesome.DEFAULT_FONT_SIZE * scaledDensity; float rawSize = a.getDimension(R.styleable.BootstrapButton_android_textSize, defaultDimen); fontSize = rawSize / scaledDensity; } } } finally { if (a != null) { a.recycle(); } } View v = inflater.inflate(R.layout.bootstrap_button, this, false); BootstrapSize bootstrapSize = BootstrapSize.getBootstrapSizeFromString(size); paddingA = (int) (bootstrapSize.paddingA * scale + 0.5f); paddingB = (int) (bootstrapSize.paddingB * scale + 0.5f); //get layout items layout = (ViewGroup) v.findViewById(R.id.layout); lblLeft = (TextView) v.findViewById(R.id.lblLeft); lblMiddle = (TextView) v.findViewById(R.id.lblMiddle); lblRight = (TextView) v.findViewById(R.id.lblRight); setBootstrapType(bootstrapStringType); //set the font awesome icon typeface if (!isInEditMode()) { lblLeft.setTypeface(FontAwesome.getFont(getContext())); lblRight.setTypeface(FontAwesome.getFont(getContext())); } //set up the font size lblLeft.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize); lblMiddle.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize); lblRight.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize); //deal with gravity if (gravity.length() > 0) { setTextGravity(gravity); } boolean onlyIcon = true; //set the text if (text.length() > 0) { lblMiddle.setText(text); lblMiddle.setVisibility(View.VISIBLE); onlyIcon = false; } setupIconLeft(paddingA, paddingB, iconLeft, iconRight, onlyIcon); setupIconRight(paddingA, paddingB, iconLeft, iconRight, onlyIcon); if (iconLeft.length() > 0 && iconRight.length() > 0) { lblMiddle.setPadding(paddingA, 0, paddingA, 0); } this.setClickable(true); this.setEnabled(enabled); layout.setPadding(0, paddingB, 0, paddingB); addView(v); } private void setupIconLeft(int paddingA, int paddingB, String iconLeft, String iconRight, boolean onlyIcon) { //set up the padding if (iconLeft.length() > 0) { setLeftIcon(iconLeft); lblLeft.setVisibility(View.VISIBLE); if (!onlyIcon) { lblLeft.setPadding(paddingB, 0, 0, 0); } else { lblLeft.setPadding(paddingB, 0, paddingB, 0); } //padding for symmetry if ((iconRight.length() == 0) && !onlyIcon) { lblMiddle.setPadding(paddingA, 0, paddingB, 0); } } } private void setupIconRight(int paddingA, int paddingB, String iconLeft, String iconRight, boolean onlyIcon) { if (iconRight.length() > 0) { setRightIcon(iconRight); lblRight.setVisibility(View.VISIBLE); if (!onlyIcon) { lblRight.setPadding(0, 0, paddingB, 0); } else { lblRight.setPadding(paddingB, 0, paddingB, 0); } //padding for symmetry if ((iconLeft.length() == 0) && !onlyIcon) { lblMiddle.setPadding(paddingB, 0, paddingA, 0); } } } public void setText(int stringId) { setText(getContext().getResources().getString(stringId)); } /** * Changes the button text * * @param text - String value for what is displayed on the button */ public void setText(String text) { lblMiddle.setText(text); } /** * Changes the left icon on a BootstrapButton * * @param leftIcon- String value for the icon as per http://fortawesome.github.io/Font-Awesome/cheatsheet/ */ public void setLeftIcon(String leftIcon) { lblLeft.setText(FontAwesome.getUnicode(leftIcon)); } /** * Changes the right icon on a BootstrapButton * * @param rightIcon - String value for the icon as per http://fortawesome.github.io/Font-Awesome/cheatsheet/ */ public void setRightIcon(String rightIcon) { lblRight.setText(FontAwesome.getUnicode(rightIcon)); } /** * Changes the type of BootstrapButton * * @param bootstrapType - String value for the type of button e.g. "primary" */ public void setBootstrapType(String bootstrapType) { BootstrapType type = BootstrapType.getBootstrapTypeFromString(bootstrapType); int buttonBg = (roundedCorners) ? type.getRoundedBg() : type.getNormalBg(); layout.setBackgroundResource(buttonBg); int textColor = getResources().getColor(type.getTextColour()); lblLeft.setTextColor(textColor); lblMiddle.setTextColor(textColor); lblRight.setTextColor(textColor); } /** * Specifies whether the BootstrapButton is enabled or disabled * * @param enabled - boolean state for either enabled or disabled */ public void setBootstrapButtonEnabled(boolean enabled) { this.setEnabled(enabled); } /** * Changes the gravity for the text on a bootstrap button that is not wrap_content * * @param gravity - string for either center, right, or left. */ public void setTextGravity(String gravity) { int gravityId = -1; switch (gravity) { case "left": gravityId = Gravity.LEFT; break; case "center": gravityId = Gravity.CENTER_HORIZONTAL; break; case "right": gravityId = Gravity.RIGHT; break; } if (gravityId != -1) { lblMiddle.setGravity(gravityId | Gravity.CENTER_VERTICAL); } } /** * Returns the text the BootstrapButton is displaying. * * @return CharSequence of text displayed */ public CharSequence getText() { return lblMiddle.getText(); } }