EP26-BottomNavigation改进

BottomNavigation的改进

SimpleBottomNavigationBar
首先要把FrameLayout改成LinearLayout。这是因为我们要使用addView()来动态添加tab。

View的构造方法

每一个自定义的View/ViewGroup都要有三个构造方法,这个自定义的控件才有用,通常是这样的:

/**
     * 第一个构造函数
     */
    public CustomView(Context context) {
        this(context, null);
    }

    /**
     * 第二个构造函数
     */
    public CustomView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    /**
     * 第三个构造函数
     */
    public CustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO:获取自定义属性
    }

我们可以看到第一个构造函数调用了第二个构造函数,第二个构造函数调用了第三个构造函数。

  • 在代码中直接new一个Custom View实例的时候,会调用第一个构造函数。

  • 在xml布局文件中调用Custom View的时候,会调用第二个构造函数,attrs就是我们在xml中为view设置的属性啦。

  • 在xml布局文件中调用Custom View,并且Custom View标签中还有自定义属性时,这里调用的还是第二个构造函数。

既然如此,我们可以把自定义View的一些初始化操作放在第二个或者第三个构造函数里面了,毕竟我们的View都是写在xml里面的,一定会调用第二个构造函数。更多细节可以看-->这里。

ViewHolder思想

昨天我用了很笨的方法,把所有tab的View都初始化了一遍,一共有10个之多,写了大量初始化方法。今天参考了一个人写的,他用了ViewHolder来包含每一个Tab底下的TextViewImageView等等。

    public static class ViewHolder {
        public BottomNavItem bottomNavItem;
        public ImageView tabIcon;
        public TextView tabTitle;
    }

然后在onClick的时候轮询ViewHodlerList中的viewHodler,突出显示选中的tab,恢复未选中的tab的原有样式。

        for (ViewHolder holder : mViewHolderList) {
            //每次点击都轮询一遍,突出显示选中的,恢复未选中的
            if (viewHolder.bottomNavItem.mText.equals(holder.bottomNavItem.mText)) {
                holder.tabIcon.setImageResource(holder.bottomNavItem.drawableSelected);
                holder.tabTitle.setTextColor(Color.RED);
                mOnTabSelectedListener.onTabSelected(holder.bottomNavItem.mText);
            } else {
                holder.tabIcon.setImageResource(holder.bottomNavItem.drawableUnselected);
                holder.tabTitle.setTextColor(Color.BLACK);
            }

还没完全写完,还有一些bug。明天再说了。

-DEC27

你可能感兴趣的:(EP26-BottomNavigation改进)