Latar Belakang
Sering kali kita perlu menyesuaikan font TextView secara otomatis dengan batasan yang diberikan padanya.
Masalah
Sedihnya, meskipun ada banyak utas dan pos (dan solusi yang disarankan) membicarakan masalah ini (contoh di sini , di sini dan di sini ), tidak satu pun dari mereka yang benar-benar berfungsi dengan baik.
Itu sebabnya, saya memutuskan untuk menguji masing-masing sampai saya menemukan real deal.
Saya pikir persyaratan dari textView tersebut harus:
Harus memungkinkan penggunaan font, jenis huruf, gaya, dan serangkaian karakter apa pun.
Harus menangani lebar dan tinggi
Tidak ada pemotongan kecuali teks tidak dapat ditampung karena batasan, kami berikan padanya (contoh: teks terlalu panjang, ukuran terlalu kecil yang tersedia). Namun, kami dapat meminta bilah gulir horizontal / vertikal jika diinginkan, hanya untuk kasus-kasus tersebut.
Harus memungkinkan multi-line atau single-line. Dalam hal multi-line, izinkan jalur maks & min.
Seharusnya tidak lambat dalam perhitungan. Menggunakan loop untuk menemukan ukuran terbaik? Setidaknya optimalkan dan jangan tambahkan sampel Anda sebanyak 1 kali setiap kali.
Dalam kasus multi-line, harus memungkinkan untuk lebih suka mengubah ukuran atau menggunakan lebih banyak baris, dan / atau memungkinkan untuk memilih sendiri garis dengan menggunakan karakter "\ n".
Apa yang saya coba
Saya sudah mencoba begitu banyak sampel (termasuk yang ada di tautan, saya sudah menulis), dan saya juga mencoba memodifikasinya untuk menangani kasus-kasus, saya sudah bicarakan, tetapi tidak ada yang benar-benar berfungsi.
Saya telah membuat proyek sampel yang memungkinkan saya untuk melihat apakah TextView secara otomatis cocok dengan benar.
Saat ini, proyek sampel saya hanya mengacak teks (alfabet Inggris plus digit) dan ukuran textView, dan membiarkannya tetap dengan satu baris, tetapi bahkan ini tidak bekerja dengan baik pada sampel yang saya coba.
Berikut kodenya (juga tersedia di sini ):
Mengajukan 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>
Mengajukan 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();
}
}
Pertanyaan
Apakah ada yang tahu solusi untuk masalah umum ini yang benar-benar berfungsi?
Bahkan solusi yang memiliki fitur jauh lebih sedikit dari apa yang saya tulis, misalnya yang hanya memiliki jumlah baris teks yang konstan, dan menyesuaikan fontnya sesuai dengan ukurannya, namun tidak pernah memiliki gangguan aneh dan membuat teks terlalu besar / kecil dibandingkan dengan ruang yang tersedia.
Proyek GitHub
Karena ini adalah TextView yang sangat penting, saya memutuskan untuk menerbitkan perpustakaan, sehingga semua orang dapat dengan mudah menggunakannya, dan berkontribusi di sini .