Arka fon
Çoğu zaman TextView yazı tipini kendiliğinden verilen sınırlara sığdırmamız gerekir.
Sorun
Ne yazık ki, bu sorun hakkında konuşan çok sayıda konu ve gönderi (ve önerilen çözümler) olmasına rağmen (örnek burada , burada ve burada ), hiçbiri gerçekten iyi çalışmıyor.
Bu yüzden, gerçek bir anlaşma bulana kadar her birini test etmeye karar verdim.
Böyle bir textView gelen gereksinimleri olması gerektiğini düşünüyorum:
Herhangi bir yazı tipi, yazı tipi, stil ve karakter kümesinin kullanılmasına izin vermelidir.
Hem genişliği hem de yüksekliği ele almalıdır
Metin sınırlama nedeniyle sığmadığı sürece kesilmez, buna verdik (örnek: çok uzun metin, çok küçük boyut). Ancak, sadece bu durumlar için yatay / dikey kaydırma çubuğu talep edebiliriz.
Çok satırlı veya tek satırlı olmalıdır. Çok hatlı olması durumunda, maksimum ve minimum hatlara izin verin.
Hesaplamada yavaş olmamalıdır. En iyi boyutu bulmak için bir döngü mü kullanıyorsunuz? En azından optimize edin ve her seferinde örneklemenizi 1 arttırmayın.
Çok satırlı olması durumunda, yeniden boyutlandırmayı veya daha fazla satır kullanmayı tercih etmeli ve / veya "\ n" karakterini kullanarak satırları kendimiz seçmemize izin vermelidir.
Ne denedim
Çok fazla örnek denedim (bağlantılarınkiler dahil, hakkında yazdım) ve ayrıca vakaları ele almak için bunları değiştirmeye çalıştım, konuştum, ama hiçbiri gerçekten işe yaramıyor.
Görsel olarak TextView otomatik olarak uygun olup olmadığını görmek için izin veren örnek bir proje yaptım.
Şu anda, örnek projem sadece metni (İngilizce alfabe artı rakamlar) ve textView boyutunu rastgele ve tek satırda kalmasına izin, ancak bu bile denedim herhangi bir örnek üzerinde iyi çalışmıyor.
İşte kod ( burada da mevcuttur ):
Dosya res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity">
<Button android:id="@+id/button1" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" android:text="Button" />
<FrameLayout android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_above="@+id/button1"
android:layout_alignParentLeft="true" android:background="#ffff0000"
android:layout_alignParentRight="true" android:id="@+id/container"
android:layout_alignParentTop="true" />
</RelativeLayout>
Dosya src/.../MainActivity.java
public class MainActivity extends Activity
{
private final Random _random =new Random();
private static final String ALLOWED_CHARACTERS ="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ViewGroup container=(ViewGroup)findViewById(R.id.container);
findViewById(R.id.button1).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(final View v)
{
container.removeAllViews();
final int maxWidth=container.getWidth();
final int maxHeight=container.getHeight();
final FontFitTextView fontFitTextView=new FontFitTextView(MainActivity.this);
final int width=_random.nextInt(maxWidth)+1;
final int height=_random.nextInt(maxHeight)+1;
fontFitTextView.setLayoutParams(new LayoutParams(width,height));
fontFitTextView.setSingleLine();
fontFitTextView.setBackgroundColor(0xff00ff00);
final String text=getRandomText();
fontFitTextView.setText(text);
container.addView(fontFitTextView);
Log.d("DEBUG","width:"+width+" height:"+height+" text:"+text);
}
});
}
private String getRandomText()
{
final int textLength=_random.nextInt(20)+1;
final StringBuilder builder=new StringBuilder();
for(int i=0;i<textLength;++i)
builder.append(ALLOWED_CHARACTERS.charAt(_random.nextInt(ALLOWED_CHARACTERS.length())));
return builder.toString();
}
}
Soru
Gerçekten çalışan bu ortak soruna bir çözüm bilen var mı?
Yazdıklarımın çok daha az özelliğine sahip bir çözüm bile, örneğin sabit sayıda metin satırı olan ve yazı tipini boyutuna göre ayarlayan, ancak asla garip aksaklıklara ve metnin elde edilmesine sahip olan bir çözüm bile kullanılabilir alanla karşılaştırıldığında büyük / küçük.
GitHub projesi
Bu kadar önemli bir TextView'un olduğundan, herkesin kolayca kullanabilir ve buna katkıda bulunabilir, böylece bir kütüphane yayınlamaya karar verdik burada .