Android kaynaklarına / değerlerine kayan nokta değeri ekleme


243

Ben kullanarak benim TextView'lar için satırlar arasında küçük bir boşluk eklemek için çalışıyorum android:lineSpacingMultiplier gelen belgelere :

Bir çarpan olarak metin satırları arasında ekstra boşluk.

"1.2" gibi bir kayan nokta değeri olmalıdır.

Bunu birkaç farklı TextView'de kullandığım için, kaynaklarıma global bir boyut / değer eklemek istiyorum, ancak varsa, hangi etiketi kullanacağımı bilmiyorum. Bana mantıklı gelen tüm kaynak türlerini denedim , ancak hiçbiri çalışmıyor.

Ne istiyorum böyle bir şey olurdu:

<resources>
    <dimen name="text_line_spacing">1.4</dimen>
</resources>

Düzenleme: Biliyorum android:lineSpacingExtra(ekli birimle bir boyuta ihtiyaç duyar), ancak android:lineSpacingMultipliermümkünse kullanmak istiyorum .

Yanıtlar:


517

Bir çözüm var:

<resources>
    <item name="text_line_spacing" format="float" type="dimen">1.0</item>
</resources>

Bu şekilde, kayan nokta numaranız @ dimen altında olacaktır. Biçimin şu anlama geldiği diğer "biçim" ve / veya "tür" değiştiricileri kullanabileceğinize dikkat edin:

Biçim = kapsayan veri türü:

  • şamandıra
  • boole
  • kesir
  • tamsayı
  • ...

ve tip:

Tür = kaynak türü (R.XXXXX.name ile başvurulur):

  • renk
  • Dimen
  • sicim
  • stil
  • vb...

Kodu koddan almak için şu snippet'i kullanmalısınız:

TypedValue outValue = new TypedValue();
getResources().getValue(R.dimen.text_line_spacing, outValue, true);
float value = outValue.getFloat();  

Bunun kafa karıştırıcı olduğunu biliyorum (çağrı bekleyebilirsiniz getResources().getDimension(R.dimen.text_line_spacing)), ancak Android dimensionsözel tedavi var ve saf "kayan nokta" numarası geçerli boyut değil.


Buna ek olarak, şamandıra sayısını boyuta koymak için küçük "hack" vardır, ancak bunun gerçekten hack olduğuna UYARIYORUZ ve şamandıra aralığını ve hassasiyetini kaybetme şansınız vardır.

<resources>
    <dimen name="text_line_spacing">2.025px</dimen>
</resources>

ve koddan,

float lineSpacing = getResources().getDimension(R.dimen.text_line_spacing);

bu durumda, değeri lineSpacingIS 2.024993896484375değil 2.025beklendiği gibi.


2
Bunu kullanmayı denedim ama koddan değeri alınırken NotFoundException, "# 0x04 türü geçerli değil" olsun.
Moises Jimenez

sorun hakkında daha spesifik olabilir misin? büyük olasılıkla biçim için yanlış veri türü kullandınız ...
Tomo

19
@rodkarom xml'den floats almak için bu XML: <item type="string" format="float" name="my_float">0.5</item>ve onu almak için bu kodu kullanın:float my_float = Float.parseFloat (getResources ().getString (R.string.my_float));
gregn3

1
@ gregn3 Bu sadece <string>etiketi ile yapılamaz mı?
pablisco

4
Bence hileli kısmı kaldırmalısın, sollution olduğu gibi mükemmel.
Mathijs Segers


43

Tüm çözümler, önceden tanımlanmış şamandıra değerini kod aracılığıyla kullanmanızı önerir.

Ancak, XML'de önceden tanımlanmış kayan nokta değerine (örneğin, düzenler) nasıl başvuracağınızı merak ediyorsanız, aşağıdakiler yaptığımın bir örneğidir ve mükemmel bir şekilde çalışır:

Olarak kaynak değerleri tanımlayın type="integer"ancak format="float"örneğin:

<item name="windowWeightSum" type="integer" format="float">6.0</item>
<item name="windowNavPaneSum" type="integer" format="float">1.5</item>
<item name="windowContentPaneSum" type="integer" format="float">4.5</item>

Ve daha sonra bunları mizanpajınızda kullanın @integer/name_of_resource, örneğin:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="@integer/windowWeightSum"                 // float 6.0
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="@integer/windowNavPaneSum"        // float 1.5
        android:orientation="vertical">
        <!-- other views -->
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="@integer/windowContentPaneSum"    // float 4.5
        android:orientation="vertical">
        <!-- other views -->
    </LinearLayout>

</LinearLayout>

1
Bu en iyi yanıttır çünkü kod döndürmek zorunda kalmadan ekran döndürme sırasında boyutsal değerleri dinamik olarak değiştirebilmemi sağlıyor.
Phileo99

@ Çekmeceler için Vyacheslav, standart ölçüleri
waqaslam

hiç çalışmıyor. AndroidStudio boyutlarda bile başarısız oluyor
Vyacheslav

Ben demek <dimen>
istedim

19

Ayrıca hiçbir uyarı ile iyi çalışıyor gibi görünen bir geçici çözüm buldum:

<resources>
    <item name="the_name" type="dimen">255%</item>
    <item name="another_name" type="dimen">15%</item>
</resources>

Sonra:

// theName = 2.55f
float theName = getResources().getFraction(R.dimen.the_name, 1, 1);
// anotherName = 0.15f
float anotherName = getResources().getFraction(R.dimen.another_name, 1, 1);

Uyarı : yalnızca xml'den değil, Java kodundaki dimen'i kullandığınızda çalışır


XML tanımında böyle bir değer kullanırsam bu talihsiz çalışmaz: android: lineSpacingMultiplier = "@ dimen / TEXT_SPACING_MULTIPLIER". Düzeni şişirirken NumberFormatException özelliğine neden olur.
peter.bartos

4
Kesinlikle. Yalnızca Java kodundaki dimen'i kullandığınızda çalışır.
Cristian

2
Bu koddan yüzer erişmek için bulabildiğim en iyi yoldur.
Alex Lockwood

Floats.xml dosyasında <item name = "shadow_percent" type = "dimen">% 25 </item> ekledim ve sonra çekilebilirliğimde bu yüzdeyi android kullanarak kullanarak gölge degradesinin merkezini ayarladım: centerY = "@ dimen / shadow_percent ". Bu, gölgeyi katman listesinin toplam yüksekliğinin% 25'ine ayarlamak için mükemmel çalıştı. TEŞEKKÜR EDERİM!
Chris Sprague

sadece bir not, type="fraction"Java kodunda hatalardan kaçınmak için kullanmalısınız
adek111

8

Dimens.xml dosyasına bir kayan nokta ekleyin:

<item format="float" name="my_dimen" type="dimen">1.2</item>

XML'den başvurmak için:

<EditText 
    android:lineSpacingMultiplier="@dimen/my_dimen"
    ...

Bu değeri programlı olarak okumak için ResourcesCompat.getFloatandroidx.core adresinden kullanabilirsiniz .

Gradle bağımlılığı:

implementation("androidx.core:core:${version}")

Kullanımı:

import androidx.core.content.res.ResourcesCompat;

...

float value = ResourcesCompat.getFloat(context.getResources(), R.dimen.my_dimen);

7

Kısıtlama düzeninin kılavuzu için de kullanabiliriz.

İnteger.xml dosyası oluşturun ve içine ekleyin

 <item name="guideline_button_top" type="integer" format="float">0.60</item>

Layout.xml dosyasından kullanın

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

1
Tam olarak ihtiyacım olan şey, bunu iki düzen dosyası oluşturmadan tabletler için farklı yüzde değerleri ve mobil cihazlar için farklı değerler için kullanıyorum
abdu

5

Bu sorunu çözmek için bir stil kullandım. Resmi bağlantı burada .

Oldukça faydalı şeyler. Stillerinizi saklayacak bir dosya ("styles.xml" gibi) oluşturur ve içinde tanımlarsınız. Ardından, mizanpajınızdaki stillere başvurursunuz ("main.xml" gibi).

İşte istediğinizi yapan örnek bir stil:

<style name="text_line_spacing">
   <item name="android:lineSpacingMultiplier">1.4</item>
</style>

Bununla basit bir TextView'i değiştirmek istediğinizi varsayalım. Düzen dosyanıza şunu yazarsınız:

<TextView
   style="@style/summary_text"
   ...
   android:text="This sentence has 1.4 times more spacing than normal."
/>

Deneyin - bu aslında tüm dahili UI android üzerinde nasıl yapılır. Stilleri kullanarak, Görünümlerinizin diğer yönlerini de değiştirebilirsiniz.


2

Aralığını kontrol ettiğiniz basit kayan noktalarınız varsa, kaynaklarda bir tamsayı olabilir ve doğrudan kodda ihtiyacınız olan ondalık basamak sayısına bölebilirsiniz.

Yani böyle bir şey

<integer name="strokeWidth">356</integer>

2 ondalık basamakla kullanılır

this.strokeWidthFromResources = resources_.getInteger(R.integer.strokeWidth);    
circleOptions.strokeWidth((float) strokeWidthFromResources/ 100);

ve bu onu 3.56f yapar

Bunun en zarif çözüm olduğunu söylememek, ancak basit projeler için uygundur.


0

Ben çalışıyorum, ancak LogCat bir Warning( WARN/Resources(268): Converting to float: TypedValue{t=0x3/d=0x4d "1.2" a=2 r=0x7f06000a}) sonuç veren bir çözüm buldum.

<resources>
    <string name="text_line_spacing">1.2</string>
</resources>

<android:lineSpacingMultiplier="@string/text_line_spacing"/>

yukarıdaki cevabımı gör. biçim ve türü belirtmeniz gereken "genel" kaynak öğesini kullanabilirsiniz. biçimi java türü (float, boolean, kesir, tamsayı vb.) içindir ve tür android gen kaynağı başvurusu içindir (R.dimen için "dimen", R.color için "color", R.string için "string" , vs.)
Tomo

Bu benim ilk cevabımdı ve şimdi çok eski, bu yüzden cevabınızı kabul ettim. :)
slup

0

Kabul edilen yanıtı geçmişte kullanmış olmama rağmen, mevcut Yapı Araçları ile yapmak mümkün görünüyor:

   <dimen name="listAvatarWidthPercent">0.19</dimen>

Build Tools ana sürümünü 29 kullanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.