7

我如何设置MenuItem官方的默认值BottomNavigationView(com.android.support:design:25.0.1)?

如果我以编程方式调用menuItem.setCheckable(true).setChecked(true),则不会执行缩放效果,并且BottomNavigationView显示如下:

底部导航视图

4

3 回答 3

8

自 Android 支持库 25.3.0 以来,有更简单的方法可以做到这一点:

bottomNavigationView.setSelectedItemId(R.id.id_of_item_you_want_to_select_as_default);
于 2017-05-11T15:29:13.593 回答
3

我以更简单的方式实现了这一点:

    //R.id.bottom_bar_icon is the icon you would like clicked by default
    bottomNavigationView.getMenu().performIdentifierAction(R.id.bottom_bar_icon, 0);

    //set the corresponding menu item to checked = true
    //and the other items to checked = false
    bottomNavigationView.getMenu().getItem(0).setChecked(false);
    bottomNavigationView.getMenu().getItem(1).setChecked(true);
    bottomNavigationView.getMenu().getItem(2).setChecked(false);
于 2017-02-02T20:12:42.297 回答
3

最后,我能够通过以下方式解决这个BottomNavigationView 问题

public class RichBottomNavigationView  extends BottomNavigationView {
private ViewGroup mBottomItemsHolder;
private int mLastSelection = INVALID_POSITION;
private Drawable mShadowDrawable;
private boolean mShadowVisible = true;
private int mWidth;
private int mHeight;
private int mShadowElevation = 2;

public RichBottomNavigationView(Context context) {
    super(context);
    init();
}

public RichBottomNavigationView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public RichBottomNavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
    ;
}


private void init() {
    mShadowDrawable = ContextCompat.getDrawable(getContext(), R.drawable.shadow);
    if (mShadowDrawable != null) {
        mShadowDrawable.setCallback(this);
    }
    setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
    setShadowVisible(true);
    setWillNotDraw(false);

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h + mShadowElevation, oldw, oldh);
    mWidth = w;
    mHeight = h;
    updateShadowBounds();
}


private void updateShadowBounds() {
    if (mShadowDrawable != null && mBottomItemsHolder != null) {
        mShadowDrawable.setBounds(0, 0, mWidth, mShadowElevation);
    }
    ViewCompat.postInvalidateOnAnimation(this);
}

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
    if (mShadowDrawable != null && mShadowVisible) {
        mShadowDrawable.draw(canvas);
    }
}

public void setShadowVisible(boolean shadowVisible) {
    setWillNotDraw(!mShadowVisible);
    updateShadowBounds();
}

public int getShadowElevation() {
    return mShadowVisible ? mShadowElevation : 0;
}

public int getSelectedItem() {
    return mLastSelection = findSelectedItem();
}

@CallSuper
public void setSelectedItem(int position) {
    if (position >= getMenu().size() || position < 0) return;

    View menuItemView = getMenuItemView(position);
    if (menuItemView == null) return;
    MenuItemImpl itemData = ((MenuView.ItemView) menuItemView).getItemData();


    itemData.setChecked(true);

    boolean previousHapticFeedbackEnabled = menuItemView.isHapticFeedbackEnabled();
    menuItemView.setSoundEffectsEnabled(false);
    menuItemView.setHapticFeedbackEnabled(false); //avoid hearing click sounds, disable haptic and restore settings later of that view
    menuItemView.performClick();
    menuItemView.setHapticFeedbackEnabled(previousHapticFeedbackEnabled);
    menuItemView.setSoundEffectsEnabled(true);


    mLastSelection = position;

}


@Override
protected Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    BottomNavigationState state = new BottomNavigationState(superState);
    mLastSelection = getSelectedItem();
    state.lastSelection = mLastSelection;
    return state;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    if (!(state instanceof BottomNavigationState)) {
        super.onRestoreInstanceState(state);
        return;
    }
    BottomNavigationState bottomNavigationState = (BottomNavigationState) state;
    mLastSelection = bottomNavigationState.lastSelection;
    dispatchRestoredState();
    super.onRestoreInstanceState(bottomNavigationState.getSuperState());
}

private void dispatchRestoredState() {
    if (mLastSelection != 0) { //Since the first item is always selected by the default implementation, dont waste time
        setSelectedItem(mLastSelection);
    }
}

private View getMenuItemView(int position) {
    View bottomItem = mBottomItemsHolder.getChildAt(position);
    if (bottomItem instanceof MenuView.ItemView) {
        return bottomItem;
    }
    return null;
}

private int findSelectedItem() {
    int itemCount = getMenu().size();
    for (int i = 0; i < itemCount; i++) {
        View bottomItem = mBottomItemsHolder.getChildAt(i);
        if (bottomItem instanceof MenuView.ItemView) {
            MenuItemImpl itemData = ((MenuView.ItemView) bottomItem).getItemData();
            if (itemData.isChecked()) return i;
        }
    }
    return INVALID_POSITION;
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mBottomItemsHolder = (ViewGroup) getChildAt(0);
    updateShadowBounds();
    //This sucks.
    MarginLayoutParams layoutParams = (MarginLayoutParams) mBottomItemsHolder.getLayoutParams();
    layoutParams.topMargin = (mShadowElevation + 2) / 2;
}

static class BottomNavigationState extends BaseSavedState {
    public int lastSelection;

    @RequiresApi(api = Build.VERSION_CODES.N)
    public BottomNavigationState(Parcel in, ClassLoader loader) {
        super(in, loader);
        lastSelection = in.readInt();
    }

    public BottomNavigationState(Parcelable superState) {
        super(superState);
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeInt(lastSelection);
    }

    public static final Parcelable.Creator<NavigationView.SavedState> CREATOR
            = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<NavigationView.SavedState>() {
        @Override
        public NavigationView.SavedState createFromParcel(Parcel parcel, ClassLoader loader) {
            return new NavigationView.SavedState(parcel, loader);
        }

        @Override
        public NavigationView.SavedState[] newArray(int size) {
            return new NavigationView.SavedState[size];
        }
    });
}
}

并打电话setSelectedItem(2)

于 2016-12-14T15:00:38.290 回答