Lý lịch
Nhiều lần chúng ta cần tự động điều chỉnh phông chữ của TextView theo các ranh giới được cung cấp cho nó.
Vấn đề
Đáng buồn thay, mặc dù có nhiều chủ đề và bài viết (và giải pháp được đề xuất) nói về vấn đề này (ví dụ ở đây , ở đây và ở đây ), không ai trong số họ thực sự hoạt động tốt.
Đó là lý do tại sao, tôi đã quyết định thử nghiệm từng người trong số họ cho đến khi tôi tìm được thỏa thuận thực sự.
Tôi nghĩ rằng các yêu cầu từ một TextView như vậy phải là:
Nên cho phép sử dụng bất kỳ phông chữ, kiểu chữ, kiểu và bộ ký tự.
Nên xử lý cả chiều rộng và chiều cao
Không cắt bớt trừ khi văn bản không thể phù hợp vì giới hạn, chúng tôi đã cung cấp cho nó (ví dụ: văn bản quá dài, kích thước có sẵn quá nhỏ). Tuy nhiên, chúng tôi có thể yêu cầu thanh cuộn ngang / dọc nếu muốn, chỉ cho những trường hợp đó.
Nên cho phép nhiều dòng hoặc một dòng. Trong trường hợp đa dòng, cho phép dòng tối đa & tối thiểu.
Không nên chậm trong tính toán. Sử dụng một vòng lặp để tìm kích thước tốt nhất? Ít nhất là tối ưu hóa nó và không tăng mẫu của bạn lên 1 lần.
Trong trường hợp nhiều dòng, nên cho phép thay đổi kích thước hoặc sử dụng nhiều dòng hơn và / hoặc cho phép tự chọn các dòng bằng cách sử dụng ký tự "\ n".
Những gì tôi đã thử
Tôi đã thử rất nhiều mẫu (bao gồm cả các liên kết, tôi đã viết về) và tôi cũng đã cố gắng sửa đổi chúng để xử lý các trường hợp, tôi đã nói về, nhưng không có gì thực sự hiệu quả.
Tôi đã thực hiện một dự án mẫu cho phép tôi xem trực quan xem TextView có tự động khớp chính xác không.
Hiện tại, dự án mẫu của tôi chỉ ngẫu nhiên hóa văn bản (bảng chữ cái tiếng Anh cộng với chữ số) và kích thước của textView và để nó ở cùng một dòng, nhưng ngay cả điều này không hoạt động tốt trên bất kỳ mẫu nào tôi đã thử.
Đây là mã (cũng có sẵn ở đây ):
Tập tin 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>
Tập tin 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();
}
}
Câu hỏi
Có ai biết một giải pháp cho vấn đề phổ biến này thực sự hoạt động không?
Ngay cả một giải pháp có ít tính năng hơn những gì tôi đã viết, ví dụ như một giải pháp chỉ có số lượng dòng văn bản không đổi và điều chỉnh phông chữ theo kích thước của nó, nhưng không bao giờ có sự cố lạ và văn bản cũng bị lỗi lớn / nhỏ so với không gian có sẵn của nó.
Dự án GitHub
Vì đây là một TextView quan trọng như vậy, tôi đã quyết định xuất bản một thư viện, để mọi người có thể dễ dàng sử dụng và đóng góp cho nó ở đây .