package net.avenwu.support.widget; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.annotation.DrawableRes; import android.support.annotation.LayoutRes; import android.support.annotation.StringRes; import android.support.v4.app.FragmentTabHost; import android.util.SparseArray; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * Created by aven on 5/3/15. */ public class SimpleTab { SparseArray<Item> mTabItems = new SparseArray<>(); ViewGroup mContentView; public void injectInto(ViewGroup parent) { parent.addView(mContentView); } public interface OnTabClickListener { void onItemClick(View view, Item item, int position); } public static class Item { private CharSequence mLabel; private Drawable mIcon; private int mLayoutId = -1; private int mLabelId = -1; private int mIconId = -1; private Decorate mDecorate; public Item setLabelWithIcon(@StringRes int label, @DrawableRes int drawable) { mLabelId = label; mIconId = drawable; return this; } public Item setCustomItemLayout(int layout, Decorate decorate) { mLayoutId = layout; mDecorate = decorate; return this; } } public interface Decorate { void onBind(View contentView); } private static abstract class SimpleListener implements View.OnClickListener { int mPosition; public SimpleListener(int position) { mPosition = position; } } public static class Builder { Context mContext; List<Item> mItems; OnTabClickListener mListener; public Builder(Context context) { mContext = context; mItems = new ArrayList<Item>(); } protected SimpleTab bind(SimpleTabLayout layout) { final SimpleTab tab = new SimpleTab(); tab.mContentView = layout; init(tab); return tab; } public SimpleTab create(@LayoutRes int... layout) { final SimpleTab tab = new SimpleTab(); if (layout != null && layout.length > 0) { tab.mContentView = (ViewGroup) View.inflate(mContext, layout[0], null); } else { LinearLayout tabLayout = new LinearLayout(mContext); tabLayout.setOrientation(LinearLayout.HORIZONTAL); tab.mContentView = tabLayout; } init(tab); return tab; } private void init(final SimpleTab tab) { for (int i = 0; i < mItems.size(); i++) { Item item = mItems.get(i); tab.mTabItems.put(i, item); if (item.mLayoutId != -1) { View itemView = View.inflate(mContext, item.mLayoutId, null); tab.mContentView.addView(itemView); if (item.mDecorate != null) { item.mDecorate.onBind(itemView); } } else { TextView label = new TextView(mContext); label.setText(item.mLabelId); label.setGravity(Gravity.CENTER); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams .WRAP_CONTENT); layoutParams.weight = 1; label.setCompoundDrawablesWithIntrinsicBounds(0, item.mIconId, 0, 0); tab.mContentView.addView(label, layoutParams); } } int count = tab.mContentView.getChildCount(); for (int i = 0; i < count; i++) { View view = tab.mContentView.getChildAt(i); view.setOnClickListener(new SimpleListener(i) { @Override public void onClick(View v) { if (mListener != null) { mListener.onItemClick(v, tab.mTabItems.get(mPosition), mPosition); } } }); } } public Builder newItem(Item item, int... position) { if (position != null && position.length > 0) { mItems.add(position[0], item); } else { mItems.add(item); } return this; } public Builder setOnTabClickListener(OnTabClickListener listener) { mListener = listener; return this; } } }