web-dev-qa-db-fra.com

Définir la taille du texte dans une vue personnalisée donne un texte énorme

J'appelle le suivant dans le constructeur de ma vue personnalisée:

private void style(Resources.Theme theme, AttributeSet attrs) {
    TypedArray a = theme.obtainStyledAttributes(
            attrs,
            R.styleable.StackedTextView,
            0, 0);

    try {
        DebugTool.assertTrue(holdr != null, "View holder has not been properly intialized.");
        String line1 = a.getString(R.styleable.StackedTextView_line1);
        setLine1(line1);
        String line2 = a.getString(R.styleable.StackedTextView_line2);
        setLine2(line2);

        line1Size = a.getDimension(R.styleable.StackedTextView_line1_textSize, 20);
        line2Size = a.getDimension(R.styleable.StackedTextView_line2_textSize, 20);
        if (line1Size > 0) {
            holdr.textLine1.setTextSize(line1Size);
        }
        if (line2Size > 0) {
            holdr.textLine2.setTextSize(line2Size);
        }

    } finally {
        a.recycle();
    }
}

Il est supposé définir le texte et la taille du texte pour 2 champs de texte.

J'ai les éléments suivants dans mon attr.xml en plus des formats de chaîne pour le contenu du texte (ce qui fonctionne très bien).

    <attr name="line1_textSize" format="dimension" />
    <attr name="line2_textSize" format="dimension" />

Lorsque j'utilise cette vue et que je définis la taille du texte à l'aide d'une dimension via xml, 

        <com.me.app.view.component.StackedTextView
            Android:id="@+id/overview_total_reviews"
            app:line1="40"
            app:line2="Rating"
            style="@style/OverviewStackedText"
            app:line1_textSize="10sp"
            app:line2_textSize="12sp"
            />

le texte finit par être beaucoup plus volumineux que prévu. Je ne règle que 10 et 12sp respectivement, et les tailles de texte sont plus proches de 30sp.

Quelqu'un peut-il voir ce que je fais mal? Dois-je utiliser quelque chose avec DisplayMetrics pour m'assurer que les éléments sont correctement redimensionnés?

Edit: Ajout de clarification  

La dimension IS est ramassée. Le texte change lorsque je définis différentes tailles de texte à l'aide de mon attribut personnalisé (au format xml). J'ai aussi essayé d'utiliser getDimensionPixelSize.

C'est comme si la récupération de calcul/dimension était fausse. Un changement de 1sp (ou dp) entraîne un changement significatif. 

29
loeschg

Essayez plutôt ce qui suit:

line1Size = a.getDimensionPixelSize(R.styleable.StackedTextView_line1_textSize, 0);
line2Size = a.getDimensionPixelSize(R.styleable.StackedTextView_line2_textSize, 0);

if (line1Size > 0) {
    holdr.textLine1.setTextSize(TypedValue.COMPLEX_UNIT_PX, line1Size);
}
if (line2Size > 0) {
    holdr.textLine2.setTextSize(TypedValue.COMPLEX_UNIT_PX, line2Size);
}
48
plackemacher

@loeschg J'ai eu le même problème, mais j'ai finalement réussi à résoudre en utilisant la réponse de @plackemacher plus que link

La méthode .getDimensionPixelSizealways () renvoie la valeur en pixel, vous devez donc utiliser la méthode convertPixelsToDp pour obtenir la valeur dp.

Voici le code qui peut vous aider:

 /**
 * This method converts device specific pixels to density independent pixels.
 * 
 * @param px A value in px (pixels) unit. Which we need to convert into db
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent dp equivalent to px value
 */
public static float convertPixelsToDp(float px, Context context){
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

line1Size = convertPixelsToDp(a.getDimensionPixelSize(R.styleable.StackedTextView_line1_textSize, 0), some_context);
line2Size = convertPixelsToDp(a.getDimensionPixelSize(R.styleable.StackedTextView_line2_textSize, 0), some_context);

if (line1Size > 0) {
    holdr.textLine1.setTextSize(TypedValue.COMPLEX_UNIT_PX, line1Size);
}
if (line2Size > 0) {
    holdr.textLine2.setTextSize(TypedValue.COMPLEX_UNIT_PX, line2Size);
}
0
Daniel Luche