質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1624閲覧

テキストサイズの自動変更について

mogu

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/03/08 12:41

テキストサイズの自動変更について、どなたかご教示頂ければ幸いです。

現在 Android Studioにて、アプリを作成しております。
TextViewに文字列をセットする際に、文字に数に応じてテキストサイズを自動的に変更し、
TextViewの幅に収める仕組みを、

TextViewのフォントサイズを自動調整する。

上サイトに記載のコードを流用しました。
文字をTextViewにセットすると、即時に自動にサイズ変更はされるのですが、
以下の場合には文字サイズが即時に変更されずに、
端末の戻るキーでアプリを閉じ、再起動させた時に変更されます。

・文字数が多い(テキストサイズが小さい)状態から、文字数が少ない状態へ変更する

この条件の場合に(他に条件があるかもしれませんが)反映が即時でないのはなぜでしょうか。
どなたかご教示頂ければ幸いです。

以下にコードを記載致します。

JAVA

1/** 2 * フォントサイズ自動調整TextView 3 */ 4public class FontFitTextView extends AppCompatTextView { 5 /** 6 * コンストラクタ 7 * @param context 8 */ 9 public FontFitTextView(Context context) 10 { 11 super(context); 12 } 13 14 /** 15 * コンストラクタ 16 * @param context 17 * @param attrs 18 */ 19 public FontFitTextView(Context context, AttributeSet attrs) 20 { 21 super(context, attrs); 22 } 23 24 /** 25 * 子Viewの位置を決める 26 */ 27 @Override 28 protected void onLayout(boolean changed, int left, int top, int right, int bottom) 29 { 30 super.onLayout(changed, left, top, right, bottom); 31 resize(); 32 } 33 34 /** 35 * テキストサイズ調整 36 */ 37 private void resize() 38 { 39 40 /** 最小のテキストサイズ */ 41 final float MIN_TEXT_SIZE = 10f; 42 43 int viewHeight = this.getHeight(); // Viewの縦幅 44 int viewWidth = this.getWidth(); // Viewの横幅 45 46 // テキストサイズ 47 float textSize = getTextSize(); 48 49 // Paintにテキストサイズ設定 50 Paint paint = new Paint(); 51 paint.setTextSize(textSize); 52 53 // テキストの縦幅取得 54 FontMetrics fm = paint.getFontMetrics(); 55 float textHeight = (float) (Math.abs(fm.top)) + (Math.abs(fm.descent)); 56 57 // テキストの横幅取得 58 float textWidth = paint.measureText(this.getText().toString()); 59 60 // 縦幅と、横幅が収まるまでループ 61 while (viewHeight < textHeight | viewWidth < textWidth) 62 { 63 // 調整しているテキストサイズが、定義している最小サイズ以下か。 64 if (MIN_TEXT_SIZE >= textSize) 65 { 66 // 最小サイズ以下になる場合は最小サイズ 67 textSize = MIN_TEXT_SIZE; 68 break; 69 } 70 71 // テキストサイズをデクリメント 72 textSize--; 73 74 // Paintにテキストサイズ設定 75 paint.setTextSize(textSize); 76 77 // テキストの縦幅を再取得 78 fm = paint.getFontMetrics(); 79 textHeight = (float) (Math.abs(fm.top)) + (Math.abs(fm.descent)); 80 81 // テキストの横幅を再取得 82 textWidth = paint.measureText(this.getText().toString()); 83 } 84 85 // テキストサイズ設定 86 setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); 87 88 } 89} 90

以上、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2018/03/08 18:06 編集

Android SDKのAPIレベル26で、TextViewのフォントサイズを自動選択してくれるAutosizing TextViewsという機能が追加されました。参考にされたサイトはそれ以前のものなので、自力でフォントサイズを求める実装をされたのでしょう。この質問の状況においても、その追加機能を用いれば解決できるものと思いますが、そのような機能は用いず、提示されたコードを修正して目的を達するのが主題であるということでしょうか?
mogu

2018/03/08 21:36

Autosizing TextViewsを使用した場合に、APIレベルが26未満の端末利用者の場合に、どのような状況になるかわからず、自力でと思っておりました。
keicha_hrs

2018/03/09 01:18

Support Libraryによって、Android 4.0以降の端末であればAutosizing TextViewsを用いたアプリを動作させることは可能です。それ未満のAndroidバージョンの端末をターゲットにする必要があるならば使えません。
mogu

2018/03/09 07:35

利用者の端末はAndroid 4.0以降で占めておりますので、問題なく利用出来そうです。ありがとうございます。
guest

回答1

0

ベストアンサー

別件として、質問のコードがなぜ思うように動作しなかった原因をちょっと見てみたのですが、ご提示いただいたコードは

  • サイズ調整は初回描画のときのみ
  • 「現在のフォントサイズ」を起点に徐々に小さくすることで最適サイズを探している

という処理になっていることがご希望の動作にならない原因であろうと思います。参考にした処理自体が、再描画を想定していなかったということですね。

下記のような感じにすれば、それを回避できるのではないでしょうか。

Java

1 /* テキスト内容を変更したときに呼ばれるメソッドをオーバーライド */ 2 @Override 3 protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { 4 super.onTextChanged(text, start, lengthBefore, lengthAfter); 5 /* 変更前の文字列の長さが0のとき(即ち起動直後)はresize()を呼ばない */ 6 if (lengthBefore > 0) { 7 resize(); 8 } 9 } 10 11 private void resize() { 12 13 /** 最小のテキストサイズ */ 14 final float MIN_TEXT_SIZE = 10f; 15 /** 最大のテキストサイズ(sp単位) */ 16 final float MAX_TEXT_SIZE = 48f; 17 18 // 中略 19 20 // テキストサイズ 21 // float textSize = getTextSize(); 22 float textSize = MAX_TEXT_SIZE * Resources.getSystem().getDisplayMetrics().scaledDensity; // spをpixelに変換 23 24 // 以下略

まあ、Autosizing TextViewsが利用可能ならばそれが最もシンプルな解決法なので、これはあくまで余談として。

投稿2018/03/09 08:36

keicha_hrs

総合スコア6766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mogu

2018/03/09 11:09

ありがとうございます。 FontFitTextViewに追加・修正いただいたソースで、思う動きが叶いました。 ご丁寧に解説も頂き、ありがとうございます。 感謝致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問