web-dev-qa-db-ja.com

TextViewの自動サイズ調整が機能しない(Android O)

サポートライブラリ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」ですが、結果は enter image description here

(TextViewはConstraintLayout内に黄色の円の背景があります。)

ご覧のとおり、textviewはサイズ変更されていません。何をすべきか考えていますか?

ありがとう。

39
Josef Hruška

いくつかの状況でこれをテストしましたが、以下の結論に達しました。

and高さの境界が必要です。たとえば、幅をmatch_parentに設定し、高さはwrap_contentに設定した場合、Androidは、テキストをどれだけ高くしたいかを知らないと思います。あなたの例では、特定の高さを持っていないので、それがうまくいかない理由だと思います。

例えば:

wrap content height for a text

specific height for a text

Android公式ドキュメントがwrap_contentを例として使用する理由がわかりません...

ご覧のとおり、この例では他の属性を使用していなかったため、属性が間違っているという問題ではない可能性があります。

そして、はい、私が使用しているTextViewはAndroid.support.v7.widget.AppCompatTextViewです。

また、サポートライブラリ26.0.0以降を使用している限り、それで十分です。

編集:

ConstraintLayoutに関しては、プリンシパルは同じです。境界付きの幅と高さの両方が必要です。つまり、各次元について以下のいずれかを意味します。

  1. その次元の絶対値(幅または高さ)を指定しました

  2. Constraintを両方向に設定しました

例えば:

All 4 directions are constrainedHeight set to be an absolute valueWidth set to be an absolute value

更新:(2017-09-21)

残念ながら、カスタムライブラリをまだサポートしていないようです。これは、サポートライブラリv26で一緒に公開されている機能です...

40
Sira Lam

他の正解に加えて、自動サイズ調整が機能しない別のポイントを見つけました。

Android:singleLine="true"を自動サイズ設定と一緒に使用しないでください。代わりに新しいAndroid:maxLines="1"を使用してください。

41
Henning

同じ問題がありました。 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"/>
8
Apollo

どの値をAndroid:layout_height属性に設定しましたか?

ドキュメントから : "XMLファイルに自動サイズ設定を設定する場合、TextViewのlayout_widthまたはlayout_height属性に値" wrap_content "を使用することは推奨されません。予期しない結果が生じる可能性があります。 "

6
John Le

私の場合、非常に愚かな問題がありました。自動サイズ変更は常にうまくいきましたが、1つのTextViewでAndroid:ではなくapp:名前空間を使用しました。私は自分の間違いを完全に忘れていて、なぜうまくいかなかったのか疑問に思っていました。したがって、AppCompatテーマを使用するときは、ネイティブ属性ではなく、必ずAppCompat属性を使用してください。

5
0101100101

TextViewをこのように設定します

<TextView
    Android:id="@+id/vName"
    Android:layout_width="56dp"
    Android:layout_height="wrap_content"
    Android:maxLines="1"
    Android:text="Groupa"
    app:autoSizeMinTextSize="12sp"
    app:autoSizeMaxTextSize="20sp"
    app:autoSizeTextType="uniform"
    />

Android 22、23、26でうまく機能します
enter image description here

3
Phan Van Linh

投稿したリンクに記載されている4つの属性すべてを設定しようとしましたか?

例えば。

app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"

幅と高さの両方をwrap_contentに設定し、minWidthとmaxWidthを56dpに設定することもできます。

Possもコメントで言及したように、maxlinesは(私にとっても)問題を引き起こすようです。

2
FJJ

textviewのサイズがわからない場合。例えばそれらをlinearlayoutに配置し、高さまたは幅を0dpに設定します。それから解決策を得た。 OnSizeChangedイベントでAutoSizeTextTypeWithDefaultsを設定する必要があります。

@Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        this.setAutoSizeTextTypeWithDefaults(AUTO_SIZE_TEXT_TYPE_UNIFORM);

    }
1
William

@ Sira Lamの受け入れられた回答への追加情報:

AutoTextSizeの動作に競合する可能性のある属性、特にAndroid:singleLineを常に継承しないようにしてください。

Android:maxLinesまたはAndroid:linesしないに応じてTextViewのサイズ変更を妨げますが、singleLine属性(trueに設定されている場合)完全に自動サイズ設定を無効にします。

そのため、AutoTextSizeの問題を追跡するときは、最初にsingleLine属性を検索してみてください。これは、Buttonを拡張するときに継承されることがあるためです。

1
R B

@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" />
0
dastan