sfondo
Molte volte è necessario adattare automaticamente il carattere di TextView ai limiti dati ad esso.
Il problema
Purtroppo, anche se ci sono molti thread e post (e soluzioni suggerite) che parlano di questo problema (esempio qui , qui e qui ), nessuno di questi funziona davvero bene.
Ecco perché, ho deciso di testare ciascuno di essi fino a quando non trovo il vero affare.
Penso che i requisiti di tale textView dovrebbero essere:
Dovrebbe consentire l'utilizzo di qualsiasi carattere, carattere tipografico, stile e set di caratteri.
Dovrebbe gestire sia la larghezza che l'altezza
Nessun troncamento a meno che il testo non possa adattarsi a causa della limitazione, gli abbiamo dato (esempio: testo troppo lungo, dimensione disponibile troppo piccola). Tuttavia, se lo desideriamo, potremmo richiedere la barra di scorrimento orizzontale / verticale, solo per quei casi.
Dovrebbe consentire la linea multipla o singola. In caso di linee multiple, consentire le linee massima e minima.
Non dovrebbe essere lento nel calcolo. Usando un anello per trovare la dimensione migliore? Almeno ottimizzalo e non incrementare il campionamento di 1 ogni volta.
Nel caso di più righe, dovrebbe consentire di preferire il ridimensionamento o l'utilizzo di più righe e / o consentire di scegliere noi stessi le righe utilizzando il carattere "\ n".
Quello che ho provato
Ho provato così tanti esempi (compresi quelli dei collegamenti, di cui ho scritto) e ho anche provato a modificarli per gestire i casi, di cui ho parlato, ma nessuno funziona davvero.
Ho realizzato un progetto di esempio che mi consente di vedere visivamente se TextView si adatta automaticamente.
Attualmente, il mio progetto di esempio randomizza solo il testo (l'alfabeto inglese più le cifre) e le dimensioni di textView, e lascia che rimanga su una sola riga, ma anche questo non funziona bene su nessuno dei campioni che ho provato.
Ecco il codice (disponibile anche qui ):
File 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>
File 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();
}
}
La domanda
Qualcuno sa di una soluzione per questo problema comune che funziona davvero?
Perfino una soluzione che ha molte meno funzioni rispetto a ciò di cui ho scritto, ad esempio una che ha solo un numero costante di righe di testo, e regola il suo carattere in base alle sue dimensioni, senza mai avere strani problemi e avere anche il testo grande / piccolo rispetto al suo spazio disponibile.
Progetto GitHub
Dato che si tratta di un TextView così importante, ho deciso di pubblicare una libreria, in modo che tutti possano usarla facilmente e contribuire ad essa, qui .