0

我想将 NavigationDrawer 添加到我的所有活动中。我对在 stackoverflow 和其他论坛上找到的许多解决方案不满意。然后我发现了这个MaterialDrawer 库,它看起来很容易。但是知道我想为抽屉中的所有项目实现自己的样式。我怎么能用这个库做到这一点?

4

1 回答 1

0

构建时考虑到了MaterialDrawer灵活性。它接受实现IDrawerItem接口的对象。IDrawerItem因此,您只需实现接口即可轻松添加自己的元素。已经有一些默认值DrawerItems,例如PrimaryDrawerItem您可以依赖的(只是扩展它),或者您可以使用完整的自定义方法。

为了让事情变得更容易,MaterialDrawerAbstractDrawerItem已经实现了大多数项目所需的默认行为。

您可以在此处查看示例应用程序中添加的自定义 DrawerItems 。

一个完整的自定义项是IconDrawerItem

public class IconDrawerItem extends AbstractDrawerItem<IconDrawerItem, IconDrawerItem.ViewHolder> {
    protected ImageHolder icon;
    protected ImageHolder selectedIcon;

    protected boolean iconTinted = false;

    protected ColorHolder iconColor;
    protected ColorHolder selectedIconColor;
    protected ColorHolder disabledIconColor;

    //GETTER & SETTER REMOVED TO KEEP THE SNIPPET SMALL

    @Override
    public int getType() {
        return R.id.material_drawer_item_icon_only;
    }

    @Override
    @LayoutRes
    public int getLayoutRes() {
        return R.layout.material_drawer_item_icon_only;
    }

    @Override
    public void bindView(ViewHolder viewHolder) {
        Context ctx = viewHolder.itemView.getContext();

        //set the identifier from the drawerItem here. It can be used to run tests
        viewHolder.itemView.setId(hashCode());

        //get the correct color for the icon
        int iconColor;
        if (this.isEnabled()) {
            iconColor = ColorHolder.color(getIconColor(), ctx, R.attr.material_drawer_primary_icon, R.color.material_drawer_primary_icon);
        } else {
            iconColor = ColorHolder.color(getDisabledIconColor(), ctx, R.attr.material_drawer_hint_icon, R.color.material_drawer_hint_icon);
        }
        int selectedIconColor = ColorHolder.color(getSelectedIconColor(), ctx, R.attr.material_drawer_selected_text, R.color.material_drawer_selected_text);

        //get the drawables for our icon and set it
        Drawable icon = ImageHolder.decideIcon(getIcon(), ctx, iconColor, isIconTinted(), 1);
        Drawable selectedIcon = ImageHolder.decideIcon(getSelectedIcon(), ctx, selectedIconColor, isIconTinted(), 1);
        ImageHolder.applyMultiIconTo(icon, iconColor, selectedIcon, selectedIconColor, isIconTinted(), viewHolder.icon);

        //call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required)
        onPostBindView(this, viewHolder.itemView);
    }

    @Override
    public ViewHolderFactory getFactory() {
        return new ItemFactory();
    }

    public static class ItemFactory implements ViewHolderFactory<ViewHolder> {
        public ViewHolder create(View v) {
            return new ViewHolder(v);
        }
    }

    protected static class ViewHolder extends RecyclerView.ViewHolder {
        private View view;
        protected ImageView icon;

        private ViewHolder(View view) {
            super(view);
            this.view = view;
            this.icon = (ImageView) view.findViewById(R.id.material_drawer_icon);
        }
    }
}

没有限制。您只需将类型定义为标识符、使用的布局,并实现bindView()将被调用以将数据设置到所有视图的布局。

于 2016-04-17T14:57:09.533 回答