android 关于封装tabbar,任意修改样式



主要代码:

package com.sun.framework.CustomizeVC;

import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.sun.framework.Utils.ScreenUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

public class TabBar extends LinearLayout {

    public int mSelectTextColor;//default Color.WHITE 选择字体颜色
    public int mUnSelectTextColor;//default Color.parseColor("#808080") 灰色 没有选择字体颜色
    public int mUnSelectTabItemBgColor;//default Color.argb(0,0,0,0) 没有选中的item背景颜色
    public int mSelectTabVItemBgColor;//default Color.argb(0,0,0,0) 选中的item背景颜色
    public int mDefaultSelectIndex;//default 0

    public Boolean mIsFullScreen;//default false 是否全屏
    public Boolean mIsFragRemove;//default false 使用Remove frag的逻辑  true 使用hide frag的逻辑
    public Boolean mIsShowTabBarView;//default true 是否显示TabBarView

    public int[] mSelectImageVIconArray;
    public int[] mUnSelectImageVIconArray;

    public int[] mSelectTextColorArray;
    public int[] mUnSelectTextColorArray;

    public Class<?>[] mTabFragmentClassArray;
    public String[] mTextVTitleArray;

    public float mTabBarHeight; //default 49
    public float mTabBar_ImageV_Height; //default 25
    public float mTabBar_ImageV_Width;//default 25
    public float mTabBar_TextV_Height;//default WRAP_CONTENT
    public float mTabBar_TextV_Width;//default WRAP_CONTENT
    public int mTabBarViewBackgroundColor;//default Color.rgb(0,0,0) tabbar背景颜色

    private List<Fragment> fragLst;
    private Map<Object, Fragment> tabFragS;
    private FrameLayout tabFragContainer;
    public LinearLayout tabBarView;
    private List<View> tabLst;
    private int preSelectIndex = -1;
    private Context context;
    private ScreenUtils screenUtils;
    private OnTabSelectedChangingListener onTabSelectedChangingListener;

    public TabBar(Context context) {
        super(context);
        this.context = context;
        commonInit();
    }

    public TabBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        commonInit();
    }

    public TabBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    private void commonInit() {
        this.setOrientation(VERTICAL);
        screenUtils = new ScreenUtils(context);
        mIsFullScreen = false;
        mIsFragRemove = false;
        mIsShowTabBarView = true;
        mTabBarHeight = 49;//ViewGroup.LayoutParams.WRAP_CONTENT;
        mTabBar_ImageV_Height = 25;
        mTabBar_ImageV_Width = 25;
        mTabBar_TextV_Height = ViewGroup.LayoutParams.WRAP_CONTENT;
        mTabBar_TextV_Width = ViewGroup.LayoutParams.WRAP_CONTENT;
        mTabBarViewBackgroundColor = Color.rgb(0, 0, 0);
        mUnSelectTabItemBgColor = Color.argb(0, 0, 0, 0);
        mSelectTabVItemBgColor = Color.argb(0, 0, 0, 0);
        mUnSelectTextColor = Color.parseColor("#808080");
        mSelectTextColor = Color.WHITE;
        mDefaultSelectIndex = 0;
    }

    public void refreshTabBar() {

        if (this.getChildCount() > 0) {
            this.removeAllViews();
        }

        tabLst = new ArrayList<View>();
        fragLst = new ArrayList<Fragment>();
        tabFragS = new HashMap<Object, Fragment>();

        tabFragContainer = new FrameLayout(context);

        tabFragContainer.setBackgroundColor(Color.WHITE);

        if (mIsShowTabBarView) {
            tabBarView = new LinearLayout(context);
            tabBarView.setBackgroundColor(mTabBarViewBackgroundColor);
        }
        if (!mIsFullScreen) {
            this.addView(tabFragContainer);
            if (mIsShowTabBarView) {
                this.addView(tabBarView);
            }
        } else {
            RelativeLayout relativeLayout = new RelativeLayout(context);
            LinearLayout linearLayout = new LinearLayout(context);
            linearLayout.addView(tabFragContainer);
            relativeLayout.addView(linearLayout);

            RelativeLayout.LayoutParams relativeLayoutLayoutParams = (RelativeLayout.LayoutParams) linearLayout.getLayoutParams();
            relativeLayoutLayoutParams.height = LayoutParams.MATCH_PARENT;
            relativeLayoutLayoutParams.width = LayoutParams.MATCH_PARENT;

            if (mIsShowTabBarView) {
                LinearLayout linearLayout2 = new LinearLayout(context);
                linearLayout2.addView(tabBarView);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1);
                linearLayout2.setLayoutParams(params);
                relativeLayout.addView(linearLayout2);
            }
            this.addView(relativeLayout);

        }
        if (mIsShowTabBarView) {
            LayoutParams tabContLayoutParams = (LayoutParams) tabBarView.getLayoutParams();
            tabContLayoutParams.height = screenUtils.dp2px(mTabBarHeight);
            tabContLayoutParams.width = LayoutParams.MATCH_PARENT;
            //tabContLayoutParams.weight=0;
        }

        LayoutParams tabPageContLayoutParams = (LayoutParams) tabFragContainer.getLayoutParams();
        tabPageContLayoutParams.height = LayoutParams.MATCH_PARENT;
        tabPageContLayoutParams.width = LayoutParams.MATCH_PARENT;
        tabPageContLayoutParams.weight = 1;

        if (mIsShowTabBarView) {

            for (int i = 0; i < mSelectImageVIconArray.length; i++)
                AddTab(i);

            if (mDefaultSelectIndex != -1)
                On_TablClick_Listner.onClick(tabLst.get(mDefaultSelectIndex));

        } else {

            AddTabFrag(mTabFragmentClassArray[mDefaultSelectIndex]);
        }

    }


    public void setOnTabSelectedChangingListener(
            OnTabSelectedChangingListener onTabSelectedChangingListener) {
        this.onTabSelectedChangingListener = onTabSelectedChangingListener;
    }

    public void SwitchTabBar(int tabBarIndex) {

        if (mIsShowTabBarView) {
            if (tabBarIndex < 0 || tabBarIndex > tabLst.size())
                return;
            View sender = tabLst.get(tabBarIndex);
            this.On_TablClick_Listner.onClick(sender);
        } else {
            AddTabFrag(mTabFragmentClassArray[tabBarIndex]);

        }
    }

    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        this.setOrientation(LinearLayout.VERTICAL);

    }

    Fragment currentFrag;

    private void AddTabFrag(Class<?> fragClass) {

        FragmentManager fm = ((FragmentActivity) this.getContext()).getSupportFragmentManager();
        FragmentTransaction tran = fm.beginTransaction();

        if (mIsFragRemove) {
            if (currentFrag != null) {
                tran.remove(currentFrag);
            }

            FrameLayout layout = new FrameLayout(this.getContext());
            layout.setId(ViewIdGenerator.generateViewId());
            tabFragContainer.addView(layout);
            layout.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
            layout.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;

            Fragment frag = null;
            try {
                frag = (Fragment) fragClass.newInstance();
                tran.add(layout.getId(), frag);
                tran.show(frag);
                currentFrag = frag;

            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {

            Collection<Fragment> aCollection = tabFragS.values();
            for (Fragment fragment : aCollection) {
                // if (fragment.isVisible()) {
                tran.hide(fragment);
                // }
            }
            try {
                Fragment frag = tabFragS.get(fragClass.getName());

                if (frag == null) {
                    FrameLayout layout = new FrameLayout(this.getContext());
                    layout.setId(ViewIdGenerator.generateViewId());
                    tabFragContainer.addView(layout);
                    layout.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
                    layout.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
                    frag = (Fragment) fragClass.newInstance();
                    tran.add(layout.getId(), frag);
                    fragLst.add(frag);
                    tabFragS.put(fragClass.getName(), frag);
                }
                tran.show(frag);

            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        //tran.addToBackStack(null);
        tran.commit();
    }

    private void AddTab(int index) {
        LinearLayout tab = new LinearLayout(this.getContext());
        tab.setOrientation(VERTICAL);
        tab.setBackgroundColor(mUnSelectTabItemBgColor);
        tabBarView.addView(tab);

        LayoutParams params = (LayoutParams) tab.getLayoutParams();
        params.weight = 1;
        params.height = screenUtils.dp2px(mTabBarHeight);
        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        tab.setClickable(true);

        ImageView img = new ImageView(getContext());
        tab.addView(img);
        params = (LayoutParams) img.getLayoutParams();
        params.width = screenUtils.dp2px(mTabBar_ImageV_Width);
        params.height = screenUtils.dp2px(mTabBar_ImageV_Height);
        params.gravity = Gravity.CENTER;
        params.topMargin = screenUtils.dp2px(5);
        img.setImageResource(mUnSelectImageVIconArray[index]);

        TextView tv = new TextView(getContext());
        tab.addView(tv);
        params = (LayoutParams) tv.getLayoutParams();
        params.width = screenUtils.dp2px(mTabBar_TextV_Width);
        params.height = screenUtils.dp2px(mTabBar_TextV_Height);
        params.gravity = Gravity.CENTER;
        params.bottomMargin = screenUtils.dp2px(5);
        if (mUnSelectTextColorArray != null) {
            tv.setTextColor(mUnSelectTextColorArray[index]);
        } else {
            tv.setTextColor(mUnSelectTextColor);
        }
        tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
        tv.setText(mTextVTitleArray[index]);

        tab.setOnClickListener(On_TablClick_Listner);
        tabLst.add(tab);
    }

    OnClickListener On_TablClick_Listner = new OnClickListener() {

        @Override
        public void onClick(View v) {
            int index = tabLst.indexOf(v);
            if (preSelectIndex == index) return;
            if (onTabSelectedChangingListener != null && !onTabSelectedChangingListener.OnTabSelectedChanging(v, index))
                return;


            if (preSelectIndex != -1) {
                ViewGroup tab = (ViewGroup) tabLst.get(preSelectIndex);
                tab.setBackgroundColor(mUnSelectTabItemBgColor);
                ((ImageView) tab.getChildAt(0)).setImageResource(mUnSelectImageVIconArray[preSelectIndex]);
                int color;
                if (mUnSelectTextColorArray != null) {
                    color = mUnSelectTextColorArray[preSelectIndex];
                } else {
                    color = mUnSelectTextColor;
                }
                ((TextView) tab.getChildAt(1)).setTextColor(color);
            }

            preSelectIndex = index;
            ViewGroup currTab = (ViewGroup) v;
            currTab.setBackgroundColor(mSelectTabVItemBgColor);
            ((ImageView) currTab.getChildAt(0)).setImageResource(mSelectImageVIconArray[preSelectIndex]);
            int color;
            if (mSelectTextColorArray != null) {
                color = mSelectTextColorArray[preSelectIndex];
            } else {
                color = mSelectTextColor;
            }
            ((TextView) currTab.getChildAt(1)).setTextColor(color);
            AddTabFrag(mTabFragmentClassArray[index]);
        }
    };

    public interface OnTabSelectedChangingListener {
        boolean OnTabSelectedChanging(View sender, int index);
    }


    public static class ViewIdGenerator {
        private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

        public static int generateViewId() {

            if (Build.VERSION.SDK_INT < 17) {
                for (; ; ) {
                    final int result = sNextGeneratedId.get();
                    // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
                    int newValue = result + 1;
                    if (newValue > 0x00FFFFFF)
                        newValue = 1; // Roll over to 1, not 0.
                    if (sNextGeneratedId.compareAndSet(result, newValue)) {
                        return result;
                    }
                }
            } else {
                return View.generateViewId();
            }

        }
    }
}



activity_main.xml

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

    <data class="MainBinding">

    </data>

    <LinearLayout
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <com.sun.framework.CustomizeVC.TabBar
            android:id="@+id/tabBar"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </com.sun.framework.CustomizeVC.TabBar>

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent">

        </RelativeLayout>


    </LinearLayout>



使用:

package com.example.apple.test4;

import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.os.Bundle;
import com.example.apple.test4.databinding.MainBinding;
import com.sun.framework.CustomizeVC.SubFragmentActivity;
import com.sun.framework.CustomizeVC.TabBar;

public class MainActivity extends SubFragmentActivity {
    MainBinding binding;
    public TabBar tabBar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        tabBar = binding.tabBar;
        tabBar.mSelectTextColorArray = new int[]{Color.RED,Color.RED,Color.GREEN,Color.YELLOW,Color.WHITE};
        //tabBar.isShowTabBarView = false;
        //tabBar.mDefaultSelectIndex = 4;
        tabBar.mTextVTitleArray = new String[]{"预报","列表","首页","地图","设置"};
        tabBar.mSelectImageVIconArray = new int[]{R.drawable.ditu_hov,R.drawable.ditu_hov,R.drawable.ditu_hov,R.drawable.ditu_hov,R.drawable.ditu_hov};
        tabBar.mUnSelectImageVIconArray = new int[]{R.drawable.ditu_hov,R.drawable.ditu_hov,R.drawable.ditu_hov,R.drawable.ditu_hov,R.drawable.ditu_hov};
        tabBar.mTabFragmentClassArray = new Class<?>[]{ForecastFragment.class,HomeFragment.class,ForecastFragment.class,ForecastFragment.class,ForecastFragment.class};
        tabBar.refreshTabBar();
    }

}

我的业余技术微信公众号:YKJGZH,欢迎大家进入

猜你喜欢

转载自blog.csdn.net/dashenid/article/details/77450876