web-dev-qa-db-fra.com

Taille du texte et différentes tailles d'écran Android

Je sais, cela a déjà été discuté 1000 fois, mais je ne peux pas ajuster la taille du texte pour différentes tailles d'écran. J'essaie d'utiliser "sp" comme unités de taille dans mon style personnalisé:

<style name="CustumButtonStyle" parent="@Android:style/Widget.Button">
    ...
    <item name="Android:textSize">30sp</item>
    ...
</style>

En 2.7 QVGA, ça a l'air correct:

2.7QVGA 30sp

Mais dans 7in WSVGA cela ressemble à ceci:

7in WSVGA 30sp

J'ai essayé d'utiliser à la fois «sp» et «dp» avec le même résultat.

Pourriez-vous s'il vous plaît expliquer comment rendre ces boutons identiques sur n'importe quel écran?

Le style de bouton personnalisé complet

<style name="CustumButtonStyle" parent="@Android:style/Widget.Button">
    <item name="Android:background">@drawable/custom_button</item>
    <item name="Android:layout_width">fill_parent</item>
    <item name="Android:layout_height">wrap_content</item>
    <item name="Android:layout_margin">3dp</item>
    <item name="Android:textColor">#ffffff</item>
    <item name="Android:gravity">center</item>
    <item name="Android:textSize">30sp</item>
    <item name="Android:textStyle">bold</item>
    <item name="Android:shadowColor">#000000</item>
    <item name="Android:shadowDx">1</item>
    <item name="Android:shadowDy">1</item>
    <item name="Android:shadowRadius">2</item>
</style>

Et dans mon thème d'application j'ai

<item name="Android:buttonStyle">@style/CustumButtonStyle</item>

Et voici ma mise en page:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/RelativeLayout1"
Android:layout_width="fill_parent"
Android:background="@drawable/grid"
Android:gravity="center"
Android:orientation="vertical" Android:layout_height="fill_parent">

<Button
    Android:id="@+id/buttonContinue"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentTop="true"
    Android:layout_centerHorizontal="true"
    Android:layout_gravity="center"
    Android:gravity="center"
    Android:text="@string/continue_game" Android:layout_marginTop="3dp" Android:layout_marginBottom="3dp"/>



<Button
    Android:id="@+id/buttonNewGame"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignLeft="@+id/buttonContinue"
    Android:layout_alignRight="@+id/buttonContinue"
    Android:layout_below="@+id/buttonContinue"
    Android:layout_gravity="center"
    Android:gravity="center"
    Android:text="@string/new_game" Android:layout_marginTop="3dp" Android:layout_marginBottom="3dp"/>



<Button
    Android:id="@+id/ButtonAbout"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignLeft="@+id/buttonNewGame"
    Android:layout_alignRight="@+id/buttonNewGame"
    Android:layout_below="@+id/buttonNewGame"
    Android:layout_gravity="center"
    Android:gravity="center"
    Android:text="@string/about" Android:layout_marginTop="3dp" Android:layout_marginBottom="3dp"/>

102
forcelain

@forcelain Je pense que vous devez vérifier ceci Google IO Pdf for Design . Dans ce pdf, allez à la page n °: 77 où vous trouverez comment suggérer l’utilisation de dimens.xml pour différents appareils d’Android for Example, voir la structure ci-dessous:

res/values/dimens.xml

res/values-small/dimens.xml

res/values-normal/dimens.xml

res/values-large/dimens.xml

res/values-xlarge/dimens.xml

par exemple, vous avez utilisé ci-dessous dimens.xml dans les valeurs.

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">18sp</dimen>
</resources>

Dans le dossier Autres valeurs, vous devez modifier les valeurs de votre taille de texte.

Remarque: Comme indiqué par @espinchi, les petites, normales, grandes et xlarge sont obsolètes depuis Android 3.2 en faveur de ce qui suit:

Déclaration de formats de tablette pour Android 3.2

Pour la première génération de tablettes sous Android 3.0, la bonne Pour déclarer des mises en forme de tablettes, vous devez les mettre dans un répertoire avec le xlarge qualificatif de configuration (par exemple, res/layout-xlarge /). Dans afin d’adapter d’autres types de tablettes et de tailles d’écran - en Tablettes 7 "particulières - Android 3.2 introduit une nouvelle façon de spécifier des ressources pour des tailles d’écran plus discrètes. La nouvelle technique est basée sur la quantité d’espace dont votre mise en page a besoin (telle que 600dp de largeur), . plutôt que d'essayer d'adapter votre mise en page aux groupes de taille généralisés .__ (tels que grand ou xlarge).

Lorsque vous utilisez les groupes de tailles généralisés .__, la raison pour laquelle vous concevez des tablettes 7 "est délicate, c’est qu’une tablette 7" se trouve techniquement dans le même groupe en tant que combiné de 5 "(le grand groupe). Bien que ces deux périphériques soient apparemment plus proches l'un de l'autre, la quantité d'espace disponible pour l'interface utilisateur d'une application est très différente, de même que le style de l'utilisateur. Ainsi, un écran de 7 "et de 5" ne doit pas toujours utiliser la même présentation Pour vous permettre de fournir des présentations différentes pour ces deux types d’écrans, Android vous permet maintenant de spécifier vos ressources de mise en page basées sur la largeur et/ou la hauteur actuellement disponibles pour la mise en page de votre application, spécifiées en unités dp.

Par exemple, après avoir conçu la mise en page que vous souhaitez utiliser pour appareils de type tablette, vous pouvez déterminer que la mise en page s'arrête fonctionne bien lorsque l’écran a une largeur inférieure à 600dp. Ce seuil devient ainsi la taille minimale requise pour la mise en page de votre tablette . En tant que tel, vous pouvez maintenant spécifier que ces ressources de présentation doivent être utilisé seulement quand il y a au moins 600dp de largeur disponible pour votre interface utilisateur de l'application.

Vous devez choisir une largeur et un dessin correspondant à votre taille minimale, ou testez quelle est la plus petite largeur prise en charge par votre mise en page une fois que c'est Achevée.

Remarque: N'oubliez pas que tous les chiffres utilisés avec ces nouvelles API de taille sont valeurs de pixels indépendants de la densité (dp) et les dimensions de votre mise en page devrait également toujours être défini en utilisant des unités dp, car ce qui vous importe about est la quantité d’espace disponible à l’écran après le système prend en compte la densité de l'écran (par opposition à l'utilisation d'une résolution de pixels bruts ). Pour plus d'informations sur les pixels indépendants de la densité, lisez Termes et concepts, plus haut dans ce document. En utilisant une nouvelle taille qualificatifs

Les différentes configurations de ressources que vous pouvez spécifier en fonction de les espaces disponibles pour votre mise en page sont résumés dans le tableau 2. Ceux-ci les nouveaux qualificatifs vous offrent plus de contrôle sur les tailles d'écran spécifiques votre application prend en charge, par rapport à la taille d'écran traditionnelle groupes (petit, normal, grand et xlarge).

Remarque: Les tailles que vous spécifiez à l'aide de ces qualificatifs ne sont pas le tailles d'écran réelles. Plutôt, les tailles sont pour la largeur ou la hauteur en unités dp disponibles dans la fenêtre de votre activité. L'Android Le système peut utiliser une partie de l'écran pour l'interface utilisateur (telle que la barre système en bas de l'écran ou la barre d'état en haut), donc certaines. de l'écran peut ne pas être disponible pour votre mise en page. Ainsi, les tailles vous déclarez que vous devez spécifier précisément les tailles requises par votre activité: le système prend en compte tout espace utilisé par l'interface utilisateur du système lorsque déclarant combien d'espace il fournit pour votre mise en page. Méfiez-vous aussi que la barre d'action fait partie de la fenêtre de votre application espace, bien que votre mise en page ne le déclare pas, elle réduit donc le espace disponible pour votre mise en page et vous devez en tenir compte dans votre conception.Tableau 2. Nouveaux qualificateurs de configuration pour la taille de l'écran (introduits dans Android 3.2). Configuration de l'écran Valeurs du qualificateur Description plus petit largeur swdp.

Exemples: sw600dp sw720dp

La taille fondamentale d'un écran, comme indiqué par le plus court dimension de la zone d'écran disponible. Plus précisément, l'appareil smallestWidth est la plus petite des hauteurs disponibles de l'écran et largeur (vous pouvez aussi la considérer comme la "plus petite largeur possible" pour l'écran). Vous pouvez utiliser ce qualificatif pour vous en assurer, indépendamment de l'orientation actuelle de l'écran, votre application a au moins dps de largeur disponible pour son interface utilisateur. 

Par exemple, si votre mise en page nécessite que sa plus petite dimension soit La zone d’écran doit avoir au moins 600 dp en tout temps, vous pouvez alors utiliser ceci qualificateur pour créer les ressources de présentation, res/layout-sw600dp /. Le système utilisera ces ressources uniquement lorsque la plus petite dimension de l’écran disponible est d’au moins 600dp, que la valeur de 600dp ou plus side est la hauteur ou la largeur perçue par l'utilisateur. La plus petite largeur est un taille d'écran fixe caractéristique de l'appareil; l'appareil smallestWidth ne change pas lorsque l'orientation de l'écran change.

La plus petite largeur d'un périphérique prend en compte les décorations d'écran et l'interface utilisateur du système. Par exemple, si le périphérique a une interface utilisateur persistante éléments à l’écran qui représentent de l’espace le long de l’axe du smallestWidth, le système déclare que smallestWidth est plus petit que la taille réelle de l'écran, car ce ne sont pas les pixels de l'écran disponible pour votre interface utilisateur.

C'est une alternative aux qualificateurs généralisés de taille d'écran (small, normal, large, xlarge) qui vous permet de définir une discrète nombre pour la taille effective disponible pour votre interface utilisateur. En utilisant smallestWidth pour déterminer la taille générale de l'écran est utile car la largeur est souvent le facteur déterminant dans la conception d'un aménagement. Une interface va défilent souvent verticalement, mais ont des contraintes assez difficiles sur le espace minimum dont il a besoin horizontalement. La largeur disponible est également le facteur clé pour déterminer s’il faut utiliser une disposition à un volet pour combinés ou disposition à plusieurs volets pour les tablettes. Ainsi, vous vous souciez probablement le plus à propos de ce que la plus petite largeur possible sera sur chaque appareil . Largeur d'écran disponible wdp.

Exemples: w720dp w1024dp

Spécifie une largeur disponible minimale en unités dp à laquelle les ressources doit être utilisé - défini par la valeur. Le système correspondant la valeur de la largeur change lorsque l'orientation de l'écran change entre paysage et portrait pour refléter la largeur réelle actuelle c'est disponible pour votre interface utilisateur. 

Cela est souvent utile pour déterminer s'il faut utiliser une disposition à volets multiples, car même sur une tablette, vous ne voudrez souvent pas la même chose mise en page à volets multiples pour l'orientation portrait de la même manière que pour le paysage . Ainsi, vous pouvez l'utiliser pour spécifier la largeur minimale requise pour le fichier mise en page, au lieu d'utiliser à la fois la taille et l'orientation de l'écran qualificatifs ensemble. Hauteur d'écran disponible hdp.

Exemples: h720dp h1024dp etc.

Spécifie une hauteur d'écran minimale en unités dp à laquelle les ressources doit être utilisé - défini par la valeur. Le système correspondant la valeur de la hauteur change lorsque l'orientation de l'écran change entre paysage et portrait pour refléter la hauteur réelle actuelle c'est disponible pour votre interface utilisateur. 

Utiliser ceci pour définir la hauteur requise par votre mise en page est utile dans De la même manière que wdp, vous définissez la largeur requise au lieu de en utilisant à la fois les qualificatifs de taille d'écran et d'orientation. Cependant, la plupart les applications n'auront pas besoin de ce qualificatif, étant donné que les interfaces utilisateur défilent souvent verticalement et sont donc plus flexibles avec quelle hauteur est disponible, alors que la largeur est plus rigide.

L'utilisation de ces qualificateurs peut sembler plus compliquée que d'utiliser groupes de taille d'écran, il devrait en fait être plus simple une fois que vous avez déterminé les exigences pour votre interface utilisateur. Lorsque vous concevez votre interface utilisateur, l'essentiel vous vous souciez probablement de la taille réelle de votre application Bascule entre une interface utilisateur de style combiné et une interface utilisateur de style tablette qui utilise plusieurs vitres. Le point exact de cet interrupteur dépendra de votre conception particulière - peut-être avez-vous besoin d'une largeur de 720dp pour la disposition de votre tablette, peut-être 600dp est-il suffisant, ou 480dp, ou un nombre entre ceux-ci. En utilisant ces qualificatifs dans le tableau 2, vous contrôlez la taille précise à que votre mise en page change.Pour plus de détails sur ces qualificateurs de configuration de taille, voir le Document fournissant des ressources. Exemples de configuration.

Pour vous aider à cibler certaines de vos conceptions pour différents types de périphériques, voici quelques chiffres pour les largeurs d’écran typiques:.

320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc). 480dp: a tweener tablet like the Streak (480x800 mdpi). 600dp: a 7” tablet (600x1024 mdpi). 720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).

En utilisant les qualificateurs de taille du tableau 2, votre application peut basculer entre vos différentes ressources de mise en page pour les combinés et les tablettes utilisant n'importe quel nombre que vous voulez pour largeur et/ou hauteur. Par exemple, si 600dp est la plus petite largeur disponible prise en charge par la disposition de votre tablette, vous pouvez fournir ces deux ensembles de dispositions:

res/layout/main_activity.xml # Pour les combinés 
 res/layout-sw600dp/main_activity.xml # Pour les tablettes

Dans ce cas, la plus petite largeur de l’écran disponible doit être 600dp pour que la disposition de la tablette soit appliquée.

pour les autres cas dans lesquels vous souhaitez personnaliser davantage votre interface utilisateur en Différenciez les formats tels que les tablettes 7 ”et 10”, vous pouvez définir plus petites largeurs supplémentaires:

Res/layout/main_activity.xml # pour les combinés (plus petite que 600dp de largeur disponible) res/layout-sw600dp/main_activity.xml # pour 7 ” tablettes (600dp de large et plus grandes) res/layout-sw720dp/main_activity.xml.

Pour les tablettes 10 ”(720dp de large et plus grand)

notez que les deux exemples précédents de ressources utilisent le fichier qualificateur "plus petite largeur", swdp, qui spécifie le plus petit des les deux côtés de l'écran, indépendamment du courant actuel du périphérique orientation. Ainsi, l’utilisation de swdp est un moyen simple de spécifier le taille globale de l'écran disponible pour votre mise en page en ignorant le .__ de l'écran. orientation. 

Cependant, dans certains cas, l’important pour votre mise en page est exactement combien de largeur ou de hauteur est actuellement disponible. Par exemple, si vous avez une disposition à deux volets avec deux fragments côte à côte, vous voudrez peut-être l'utiliser chaque fois que l'écran fournit au moins 600dp de largeur, que le périphérique soit en orientation paysage ou portrait. Dans Dans ce cas, vos ressources pourraient ressembler à ceci:

Res/layout/main_activity.xml # Pour les combinés (d'une largeur inférieure à 600dp disponible) res/layout-w600dp/main_activity.xml # Multi-volet (tout écran de 600dp ou plus disponible).

Notez que le second ensemble utilise le qualificatif "largeur disponible", wdp. De cette façon, un seul appareil peut utiliser les deux dispositions, selon sur l’orientation de l’écran (si la largeur disponible est au moins 600dp dans une orientation et inférieure à 600dp dans l’autre orientation).

si la hauteur disponible vous préoccupe, vous pouvez faire de même en utilisant le qualificatif hdp. Ou, même combiner le WDP et HDP qualificatifs si vous devez être vraiment spécifique.

Notice that the second set is using the "available width" qualifier, wdp. This way, one device may actually use both layouts, depending on the orientation of the screen (if the available width is at least 600dp in one orientation and less than 600dp in the other orientation).

If the available height is a concern for you, then you can do the same using the hdp qualifier. Or, even combine the wdp and hdp qualifiers if you need to be really specific.

147
Herry

Je pense qu'il est trop tard pour répondre sur ce fil. Mais je voudrais partager mon idée ou un moyen de résoudre le problème de la taille du texte par rapport aux appareils de résolution de différence. De nombreux sites de développeurs Android suggèrent d’utiliser l’option sp unit pour la taille du texte, qui gérera la taille du texte pour les appareils à résolution différente. Mais je suis toujours incapable d'obtenir le résultat souhaité. J'ai donc trouvé une solution que j'utilise depuis mes 4-5 derniers projets et qui fonctionne bien. Selon ma suggestion, vous devez définir la taille du texte pour chaque périphérique de résolution, ce qui est un travail fastidieux, mais cela répondra à vos besoins. Chaque développeur doit écouter le rapport tel que4: 6: 8: 12 (h: xh: xxh: xxxh respectivement). Maintenant, dans votre dossier projet res , vous devez créer 4 dossiers avec un fichier dimens, par exemple.

  1. res/values-hdpi/dimens.xml
  2. res/values-xhdpi/dimens.xml
  3. res/values-xxhdpi/dimens.xml
  4. res/values-xxxhdpi/dimens.xml

Maintenant, dans le fichier dimens.xml, vous devez placer des tailles de texte. Je vous montre le code pour values-hdpi , de même, vous devez placer le code pour un autre fichier de valeurs/dimens.xml de résolution.

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">4px</dimen>
</resources>

Pour les autres résolutions, il s'agit de xhdpi : 6px, xxhdpi : 8px, xxxhdpi : 12px. Ceci est calculé avec le rapport (3: 4: 6: 8: 12) que j'ai écrit ci-dessus. Permet de discuter d'autres exemples de taille de texte avec le ratio ci-dessus. Si vous voulez prendre une taille de texte de 12px en hdpi, dans une autre résolution, ce serait

  1. hdpi: 12px
  2. xhdpi: 18px
  3. xxhdpi: 24px
  4. xxxhdpi: 36px

C'est la solution simple pour implémenter la taille de texte requise pour toutes les résolutions. Je ne considère pas values-mdpi appareils de résolution ici. Si quelqu'un souhaite inclure une taille de texte pour cette résolution, le rapport rationnel est semblable à 3: 4: 6: 8: 12 . Dans toute requête s'il vous plaît faites le moi savoir. J'espère que cela vous aidera.

12
Rahul Sharma

J'ai fait la même chose par dimension et Paint quelque chose comme (avec dp mais seulement pour le texte et dans drawText ())

XML:

   <dimen name="text_size">30sp</dimen>

Code:

   Paint p =new Paint();
       p.setTextSize(getResources().getDimension(R.dimen.text_Size));
9
LifeStyle

Parfois, il vaut mieux n'avoir que trois options

 style="@Android:style/TextAppearance.Small"

Utilisez petit et grand pour vous différencier de la taille d'écran normale.

<TextView
            Android:id="@+id/TextViewTopBarTitle"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            style="@Android:style/TextAppearance.Small"/>

Pour normal, vous ne devez rien spécifier.

<TextView
            Android:id="@+id/TextViewTopBarTitle"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"/>

En utilisant cela, vous évitez de tester et de spécifier des dimensions pour différentes tailles d'écran.

8
kalan

Tout le monde peut utiliser la bibliothèque Android mentionnée ci-dessous, qui constitue le moyen le plus simple de rendre les tailles de texte compatibles avec presque tous les écrans de périphériques. Il s’est en fait développé sur la base de nouveaux qualificatifs de configuration Android pour la taille de l’écran (introduit dans Android 3.2). SmallestWidth swdp.

https://github.com/intuit/sdp

2
Muhammad Maqsood

Je pense que vous pouvez archiver cela en ajoutant plusieurs ressources de présentation pour chaque taille d'écran, par exemple:

res/layout/my_layout.xml             // layout for normal screen size ("default")
res/layout-small/my_layout.xml       // layout for small screen size with small text
res/layout-large/my_layout.xml       // layout for large screen size with larger text
res/layout-xlarge/my_layout.xml      // layout for extra large screen size with even larger text
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

Référence: 1. http://developer.Android.com/guide/practices/screens_support.html

1
NguyenDat

Pour unifier tous les écrans afin d’afficher les mêmes tailles d’élément, y compris la taille de la police, procédez comme suit: .

  • Calculez par programme la taille de l'écran physique des autres téléphones, c'est-à-dire 5'2 pouces des autres téléphones/écrans. 

  • Utilisez une formule pour calculer la différence en pourcentage entre les 2 écrans. c'est-à-dire quel est le% de différence entre 4'6 et 5'2.

  • Calculez la différence de pixels entre les 2 TextViews en fonction de la formule ci-dessus.

  • Obtenez la taille réelle (en pixels) de la taille de police TextView et appliquez la différence de pixels (calculée précédemment) à la taille de police par défaut.

De cette façon, vous pouvez appliquer un format d'image dynamique à toutes les tailles d'écran et le résultat est excellent. Vous aurez une disposition et des tailles identiques sur chaque écran.

Cela peut être un peu délicat au début, mais atteint totalement l'objectif une fois que vous avez compris la formule. Avec cette méthode, il n'est pas nécessaire de créer plusieurs dispositions pour s'adapter à différentes tailles d'écran.

0
SolidSnake

Si vous avez l'API 26, vous pouvez envisager d'utiliser autoSizeTextType :

<Button
  app:autoSizeTextType="uniform" />

Le paramètre par défaut permet de redimensionner automatiquement TextView de manière uniforme sur les axes horizontal et vertical.

https://developer.Android.com/guide/topics/ui/look-and-feel/autosizing-textview

0
Bonne Bogaert

Vous pouvez également utiliser les propriétés weightSum et layout_weight pour régler vos différents écrans.

Pour cela, vous devez faire Android:layout_width = 0dp, et Android:layout_width = (comme vous voulez);

0
Harshit