Google récemment publié le widget Android.support.design.widget.NavigationView
faisant partie de la bibliothèque com.Android.support:design:22.2.0
, ce qui simplifie grandement (et normalise) le processus de création d'un NavigationDrawer.
Toutefois, conformément aux spécifications de conception }, l'élément de la liste doit être Roboto Medium, 14sp, 87% # 000000. La NavigationView
n'expose ni textSize
ni textStyle
à cette personnalisation.
Quelles sont mes options si je suis pédant pour maintenir les spécifications de conception correctes en utilisant la NavigationView
fournie par Google (ou en la personnalisant de toute autre manière)?
Depuis la bibliothèque de support Android 22.2.1, Google a modifié la taille du texte textuel par défaut des éléments NavigationView
de 16 à 14 ps, ce qui convient parfaitement aux directives de Material Design. Toutefois, dans certains cas (par exemple, lorsque vous souhaitez prendre en charge la langue chinoise), il semble que plus grand est le format de texte plus grand. La solution est simple:
app:theme="@style/yourStyle.Drawer"
à votre NavigationView
dans votre layout.xmlAndroid:textSize="16sp"
dans le style yourStyle.Drawer
créer du style
<style name="NavigationDrawerStyle">
<item name="Android:textSize">20sp</item><!-- text size in menu-->
<!-- item size in menu-->
<item name="Android:listPreferredItemHeightSmall">40dp</item>
<item name="listPreferredItemHeightSmall">40dp</item>
<!-- item padding left in menu-->
<item name="Android:listPreferredItemPaddingLeft">8dp</item>
<item name="listPreferredItemPaddingLeft">8dp</item>
<!-- item padding right in menu-->
<item name="Android:listPreferredItemPaddingRight">8dp</item>
<item name="listPreferredItemPaddingRight">8dp</item>
</style>
ajoutez-le à votre main_layout.xml
<Android.support.design.widget.NavigationView
...
app:theme="@style/NavigationDrawerStyle"
....>
</Android.support.design.widget.NavigationView>
tous les paramètres (que vous pouvez modifier) se trouvent ici modifie les éléments de navigation.
Vous pouvez également remplacer le fichier *.xml
(copier le fichier à partir de ...\sdk\extras\Android\support\design\res\layout\design_navigation_item.xml
), il suffit de créer dans votre dossier app/src/main/res/layout
un modèle nommé
design_navigation_item.xml
<Android.support.design.internal.NavigationMenuItemView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="?attr/listPreferredItemHeightSmall"
Android:paddingLeft="?attr/listPreferredItemPaddingLeft"
Android:paddingRight="?attr/listPreferredItemPaddingRight"
Android:drawablePadding="@dimen/navigation_icon_padding"
Android:gravity="center_vertical|start"
Android:maxLines="1"
Android:fontFamily="sans-serif-thin"
Android:textSize="22sp"
Android:textAppearance="?attr/textAppearanceListItem" />
toutes les dispositions qui peuvent être Overriden se trouvent ici ...\sdk\extras\Android\support\design\res\layout\
design_layout_snackbar.xml
design_layout_snackbar_include.xml
design_layout_tab_icon.xml
design_layout_tab_text.xml
design_navigation_item.xml
design_navigation_item_header.xml
design_navigation_item_separator.xml
design_navigation_item_subheader.xml
design_navigation_menu.xml
[UPDATE] Chaque version de com.Android.support:design-{version}
lib a différents éléments à remplacer. Cochez tout ce dont vous avez besoin
Vous pouvez tout personnaliser, de la couleur du texte à la taille et à la police dans votre style.xml
<style name="NavDrawerTextStyle" parent="Base.TextAppearance.AppCompat">
<item name="Android:textColor">@color/colorPrimaryDark</item>
<item name="Android:textSize">16sp</item>
<item name="Android:textStyle">bold</item>
</style>
puis dans votre NavigationView
:
<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">
<Android.support.design.widget.NavigationView
...
Android:itemTextAppearance="@style/NavDrawerTextStyle"
/>
vous pouvez utiliser ces attributs dans un fichier xml
app:itemTextAppearance="?android:attr/textAppearanceMedium"
ou pour petit texte
app:itemTextAppearance="?android:attr/textAppearance"
ou pour le gros texte
app:itemTextAppearance="?android:attr/textAppearanceLarge"
Cela a fonctionné pour moi:
activity_main.xml
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:theme="@style/NavigationDrawerStyle"
app:headerLayout="@layout/navdrawer_header"
app:menu="@menu/navdrawer_menu" />
styles.xml
<style name="NavigationDrawerStyle">
<item name="Android:textSize">16sp</item>
</style>
Parcourir le code source J'ai trouvé ce fichier de mise en page
/platform/frameworks/support/.../design/res/layout/design_drawer_item.xml
avec l'attribut suivant
<Android.support.design.internal.NavigationMenuItemView
...
Android:textAppearance="?attr/textAppearanceListItem"
Ce qui voulait dire que tout ce que nous avions à faire était de remplacer le style textAppearanceListItem
dans notre projet.
<style name="AppTheme" ... >
...
<item name="textAppearanceListItem">@style/list_item_appearance</item>
</style>
<style name="list_item_appearance">
<item name="Android:textSize">14sp</item>
<item name="Android:fontFamily">sans-serif-medium</item>
</style>
Je ne suis pas tout à fait sûr de ce que cela va affecter, mais si quelqu'un a une meilleure réponse, je serais heureux de l'accepter à la place!
Peut-être que cela pourrait aider. Récemment, je devais le faire par programme… .. J'ai utilisé cette classe:
public class CustomTypefaceSpan extends TypefaceSpan {
private final Typeface newType;
private final float newSp;
public CustomTypefaceSpan(String family, Typeface type, float sp) {
super(family);
newType = type;
newSp = sp;
}
@Override
public void updateDrawState(TextPaint ds) {
applyCustomTypeFace(ds, newType, newSp);
}
@Override
public void updateMeasureState(TextPaint Paint) {
applyCustomTypeFace(Paint, newType, newSp);
}
private static void applyCustomTypeFace(Paint paint, Typeface tf, float sp) {
int oldStyle;
Typeface old = Paint.getTypeface();
if (old == null) {
oldStyle = 0;
} else {
oldStyle = old.getStyle();
}
int fake = oldStyle & ~tf.getStyle();
if ((fake & Typeface.BOLD) != 0) {
Paint.setFakeBoldText(true);
}
if ((fake & Typeface.ITALIC) != 0) {
Paint.setTextSkewX(-0.25f);
}
Paint.setTextSize(sp);
Paint.setTypeface(tf);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<CustomTypefaceSpan> CREATOR = new Parcelable.Creator<CustomTypefaceSpan>() {
@Override
public CustomTypefaceSpan createFromParcel(Parcel in) {
return null;
}
@Override
public CustomTypefaceSpan[] newArray(int size) {
return new CustomTypefaceSpan[size];
}
};
}
Puis j'ai utilisé comme ça:
// This is for color
SpannableString s = new SpannableString(item.getTitle().toString());
s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
// This is for typeface and size
Typeface typeFace = Functions.getTypeface(this, "Avenir");
if (typeFace != null) {
int size = 19;
float scaledSizeInPixels = size * getResources().getDisplayMetrics().scaledDensity;
CustomTypefaceSpan spanTypeFace = new CustomTypefaceSpan(item.getTitle().toString(), typeFace, scaledSizeInPixels);
s.setSpan(spanTypeFace, 0, s.length(), 0);
}
item.setTitle(s);
J'espère que cela t'aides.
Liste des adaptateurs de votre barre de navigation:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:padding="10dp"
Android:orientation="horizontal"
Android:background="@drawable/pressed_state">
<TextView
Android:id="@+id/textView_list_item"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerVertical="true"
Android:layout_toRightOf="@+id/imageView_icons"
Android:textStyle="bold"
Android:layout_marginLeft="10dp"
Android:textColor="@color/white"
Android:textSize="17sp" />
<ImageView
Android:id="@+id/list_adapter_image"
Android:layout_width="10dp"
Android:layout_height="10dp"
Android:layout_centerVertical="true"
Android:layout_alignParentRight="true"
Android:visibility="visible"
Android:layout_marginRight="50dp"
Android:background="@drawable/circle_orange"/>
</RelativeLayout>
<LinearLayout
Android:layout_height="1dp"
Android:layout_width="match_parent"
Android:background="#EC1294"></LinearLayout>
</LinearLayout>
Ce paramètre dans RelativeLayout définit la couleur d'arrière-plan -> Android: background = "@ drawable/colored_state"
Faites ce "colored_state.xml" dans un dossier pouvant être dessiné.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:drawable="@color/light_blue" Android:state_pressed="true"/>
Excuse moi pour mon anglais.
Ajoutez ce code:
<dimen name = "design_bottom_navigation_text_size" outils: override = "true"> 11sp </ dimen > <dimen name = "design_bottom_navigation_active_text_size" outils: override = "true"> 12sp </ dimen>
Ça devrait marcher
P.S supprimer l'espace après <avant dimen