サポートライブラリ26に追加された新しい自動サイズ調整機能を使用します。ここにあるドキュメントを読みます。 https://developer.Android.com/preview/features/autosizing-textview.html
次のように機能するはずです:app:autoSizeTextType="uniform"
という属性で自動サイズ変更を有効にできます。 TextView
は使用可能なすべてのスペースを使用してテキスト全体(一部だけでなく、切り取られるべきではない)を表示し、textSize
はできるだけ大きくする必要があると思います。テキストの最大サイズまたは最小サイズを制限する必要がある場合は、次の2つの属性を使用できます。
app:autoSizeMinTextSize="XXsp" // (you can also use px or dp values.)
または
app:autoSizeMaxTextSize="XXsp"
ここまでは順調ですね。 56dp幅のTextViewが必要だとしましょう。異なる長さのテキストがあり、これらのテキストをこのTextView
に設定したい。可能な限り最大のtextSize
でテキスト全体(すべての文字+トリミングなし)が表示されるように、自動的にサイズ変更する必要があります。
これは私のTextViewです:
<Android.support.v7.widget.AppCompatTextView
Android:id="@+id/vName"
style="@style/TextView.AutoSize"
Android:layout_width="56dp"
Android:gravity="bottom|center_horizontal"
Android:maxLines="1"
app:autoSizeMinTextSize="1px"
app:autoSizeTextType="uniform"
app:layout_constraintBottom_toTopOf="@id/vGuideline"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
残念ながら、テキストビューはトリミングされています。このStringを上記のTextViewのテキストとして設定したかったのは、「Groupa」ですが、結果は
(TextViewはConstraintLayout内に黄色の円の背景があります。)
ご覧のとおり、textviewはサイズ変更されていません。何をすべきか考えていますか?
ありがとう。
いくつかの状況でこれをテストしましたが、以下の結論に達しました。
幅and高さの境界が必要です。たとえば、幅をmatch_parent
に設定し、高さはwrap_content
に設定した場合、Androidは、テキストをどれだけ高くしたいかを知らないと思います。あなたの例では、特定の高さを持っていないので、それがうまくいかない理由だと思います。
例えば:
Android公式ドキュメントがwrap_contentを例として使用する理由がわかりません...
ご覧のとおり、この例では他の属性を使用していなかったため、属性が間違っているという問題ではない可能性があります。
そして、はい、私が使用しているTextViewはAndroid.support.v7.widget.AppCompatTextViewです。
また、サポートライブラリ26.0.0以降を使用している限り、それで十分です。
編集:
ConstraintLayout
に関しては、プリンシパルは同じです。境界付きの幅と高さの両方が必要です。つまり、各次元について以下のいずれかを意味します。
その次元の絶対値(幅または高さ)を指定しました
Constraintを両方向に設定しました
例えば:
更新:(2017-09-21)
残念ながら、カスタムライブラリをまだサポートしていないようです。これは、サポートライブラリv26で一緒に公開されている機能です...
他の正解に加えて、自動サイズ調整が機能しない別のポイントを見つけました。
Android:singleLine="true"
を自動サイズ設定と一緒に使用しないでください。代わりに新しいAndroid:maxLines="1"
を使用してください。
同じ問題がありました。 gradleの2行を変更することで解決しました:compile 'com.Android.support:support-v4:26.0.1'
とcompile 'com.Android.support:appcompat-v7:26.0.1'
長いテキストに合わせるには、次のように4つのオプションをすべて追加する必要があります。
<Android.support.v7.widget.AppCompatTextView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:text="@string/your_string"
app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"/>
どの値をAndroid:layout_height属性に設定しましたか?
ドキュメントから : "XMLファイルに自動サイズ設定を設定する場合、TextViewのlayout_widthまたはlayout_height属性に値" wrap_content "を使用することは推奨されません。予期しない結果が生じる可能性があります。 "
私の場合、非常に愚かな問題がありました。自動サイズ変更は常にうまくいきましたが、1つのTextViewでAndroid:
ではなくapp:
名前空間を使用しました。私は自分の間違いを完全に忘れていて、なぜうまくいかなかったのか疑問に思っていました。したがって、AppCompat
テーマを使用するときは、ネイティブ属性ではなく、必ずAppCompat
属性を使用してください。
投稿したリンクに記載されている4つの属性すべてを設定しようとしましたか?
例えば。
app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"
幅と高さの両方をwrap_contentに設定し、minWidthとmaxWidthを56dpに設定することもできます。
Possもコメントで言及したように、maxlinesは(私にとっても)問題を引き起こすようです。
textviewのサイズがわからない場合。例えばそれらをlinearlayoutに配置し、高さまたは幅を0dpに設定します。それから解決策を得た。 OnSizeChangedイベントでAutoSizeTextTypeWithDefaultsを設定する必要があります。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
this.setAutoSizeTextTypeWithDefaults(AUTO_SIZE_TEXT_TYPE_UNIFORM);
}
@ Sira Lamの受け入れられた回答への追加情報:
AutoTextSizeの動作に競合する可能性のある属性、特にAndroid:singleLine
を常に継承しないようにしてください。
Android:maxLines
またはAndroid:lines
しないに応じてTextView
のサイズ変更を妨げますが、singleLine
属性(trueに設定されている場合)完全に自動サイズ設定を無効にします。
そのため、AutoTextSizeの問題を追跡するときは、最初にsingleLine
属性を検索してみてください。これは、Button
を拡張するときに継承されることがあるためです。
@Henningが言ったようにAndroid:maxLines=1
を使用してください。
<androidx.appcompat.widget.AppCompatTextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:textColor="@color/white"
Android:textSize="16sp"
Android:textStyle="bold"
Android:maxLines="1"
app:autoSizeMaxTextSize="16sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeTextType="uniform"
tools:text="Downloading" />