Ich möchte einen NavigationsDrawler zu allen meinen Aktivitäten hinzufügen. Ich bin unzufrieden mit vielen Lösungen, die ich auf Stackoverflow und anderen Foren gefunden habe. Dann habe ich diese MaterialDrawer library gefunden, die es sehr einfach zu machen scheint. Aber ich würde gerne einen eigenen Stil für alle Gegenstände in der Schublade implementieren. Wie kann ich das mit dieser Bibliothek machen?NavigationDrawer in mehreren Aktivitäten und Stil Zeile
Antwort
Die MaterialDrawer
ist auf Flexibilität ausgelegt. Es benötigt Objekte, die die Schnittstelle IDrawerItem
bilden. So können Sie einfach Ihre eigenen Elemente hinzufügen, indem Sie einfach die IDrawerItem
Schnittstelle implementieren. Es gibt bereits einige Standard DrawerItems
wie die PrimaryDrawerItem
, auf die Sie sich verlassen können (erweitern Sie es einfach) oder Sie können mit einem vollständigen benutzerdefinierten Ansatz gehen.
Um die Dinge einfacher zu machen, kommt die MaterialDrawer
mit der AbstractDrawerItem
, die bereits implementiert Standardverhalten für die meisten Elemente benötigt.
Sie können die benutzerdefinierten DrawerItems, die in der Beispielanwendung here hinzugefügt wurden, auschecken.
Eine komplette kundenspezifische Artikel ist die 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);
}
}
}
Es gibt keine Beschränkungen. Sie müssen nur den Typ als Bezeichner definieren, das Layout, das verwendet wird, und das bindView()
implementieren, das aufgerufen wird, um die Daten für alle Ansichten festzulegen.