EP 26-BottomNavigationの改良

2282 ワード

BottomNavigationの改良
SimpleBottomNavigationBarはまずFrameLayoutをLinearLayoutに変更します.これは、tabを動的に追加するためにaddView()を使用するためです.
Viewの構築方法
各カスタマイズされたView/View Groupには、通常、このカスタマイズされたコントロールが使用できる3つの構築方法があります.
/**
     *        
     */
    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:       
    }

最初のコンストラクション関数が2番目のコンストラクション関数を呼び出し,2番目のコンストラクション関数が3番目のコンストラクション関数を呼び出すのを見ることができる.
  • コード内で1つのCustom Viewインスタンスを直接newすると、最初のコンストラクション関数が呼び出されます.
  • xmlレイアウトファイルでCustom Viewを呼び出すと、2番目のコンストラクション関数が呼び出されます.attrsはxmlでviewに設定したプロパティです.
  • xmlレイアウトファイルでCustom Viewが呼び出され、Custom Viewラベルにカスタム属性がある場合、ここで呼び出されるのは2番目のコンストラクション関数です.

  • それなら、カスタムViewの初期化操作を2番目または3番目のコンストラクション関数に入れることができます.結局、私たちのViewはxmlに書かれているので、必ず2番目のコンストラクション関数を呼び出します.詳細はこちらをご覧ください.
    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);
                }
    

    まだ完全に書き終わっていないので、まだいくつかのバグがあります.明日にしましょう.
    -DEC27