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

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

ただいまの
回答率

90.50%

  • Java

    14049questions

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

  • Android

    6618questions

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

  • Android Studio

    3775questions

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

TextViewのリサイズ

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,101

SmartBuzz

score 73

TextViewでのリサイズについて教えてください。

まず、色々調べて見たのですが、TextViewにはリサイズプロパティみたいなものがないようで、TextViewを継承したクラスを自作しないといけないと言うことは調べたのですが、いろんな機能が詰まっているAndroidに、リサイズプロパティが本当にないのか?

もし、これがあるならそれで解決なのですが…。

で、もしない場合今実装しているのが

<RelativeLayout
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                    android:id="@+id/text_no"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="10dp"
                    android:text="10"/>

        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                    android:id="@+id/text_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="20dp"
                    android:text="アイウエオカキクケコ"/>

            <TextView
                android:id="@+id/text_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="@dimen/text_padding"
                android:textSize="10dp"
                android:text="10000m(10km)"/>

        </LinearLayout>
</RelativeLayout>


と、XMLに書いています。

このレイアウトを、リストビューに渡して1つ1つの列がXMLで書いたレイアウトになるようにしたいと思っています。

やりたい事は、text_numberのtextsizeは固定で、text_nameはtext_numberの余白スペースに文字サイズがリサイズされて1行で入るようにしたいです。

text_nameは左寄せ、text_numberは右寄せで考えています。

リストビュー一個あたりのレイアウト完成予想としては

============================
10                 |
アイウエオカキクケコ 10000m(10km)|
============================

このような感じです。

実現方法について教えていただきたいです。
宜しくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

API 26から新たに導入されたAutoSizing TextViewsという機能を用いれば、テキストの長さに応じてフォントサイズを調節することはできます。一応、ざっとレイアウトを作ってみたのが下図です。

AutoSizing TextViews

これでイメージに合っているのでしょうか?若しくは、この図でいうところの1行目の「アイウエオ」のフォントを可能な限り大きくして、余白が出ないようにしたいというご希望なのでしょうか?(その場合、text_nameに入る文字数が短いと、フォントのサイズが大きくなりすぎてレイアウトの高さに入りきらなくなるような気はしますが)

なんか大ファールの可能性もありそうなので、コードの提示はご返信いただいてからにさせてください(大外れだったら恥ずかしいので・・・)。


これでご希望通りということなので、詳細を追記します。なお、API 26から追加された機能ではありますが、Android Support Libraryによって過去のAndroidバージョンの端末でも動作させられます。

API 26の機能なので、Android 8.0(API 26)のSDK Platformのインストールは必須です。

過去のAndroidバージョンでも動作させるためにappcompat-v7:26.0.0以上のSupport Libraryを適用する必要がありますが、これを入手するためにbuild.gradle(Project:<プロジェクト名>) の方に下記のようにリポジトリーのアドレスを入力します。

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

なお、上記に相当する記述は、まもなく正式リリースされるAndroid Studio 3.0ではプロジェクト作成のときに自動で行われるようになるので、必要なくなります。2.3.3の間だけ必要な作業です。

次にbuild.gradle(app)の方を編集します。私が試した環境では、次のようにしました。

  • compileSdkVersion 26
  • minSdkVersion 19
  • targetSdkVersion 26

minSdkVersionはもっと下げることもできるでしょうが、下げ過ぎると次のXMLの属性で使えないものが出てくる可能性があります。ここでは19としたので、Android 4.4以上の端末で動くアプリということになります。

dependenciesの中にあるappcompat-v7のバージョンを今日現在の最新版にするため、次のようにします。

   compile 'com.android.support:appcompat-v7:26.1.0'

準備はここまで。

本題のレイアウトXMLの記述ですが、まず外側となるレイアウトの属性にxmlns:appを追加します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.autosizingsample.MainActivity">

テキストの1行分はこのような感じです。LinearLayoutの幅と高さを固定したのは見易さのためなので、この値でなければならないことはありません。

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="240dp"
        android:layout_height="24dp"
        android:layout_alignParentStart="true"
        android:orientation="horizontal">

        <android.support.v7.widget.AppCompatTextView
            android:id="@+id/text_name1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:maxLines="1"
            android:text="アイウエオ"
            app:autoSizeMaxTextSize="24sp"
            app:autoSizeMinTextSize="1sp"
            app:autoSizeTextType="uniform" />

        <TextView
            android:id="@+id/text_number1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="10000m(10km)"
            android:textSize="12sp" />
    </LinearLayout>

左側のTextViewはSupport Libraryが提供するものを用いるため、TextViewタグの代わりにandroid.support.v7.widget.AppCompatTextViewタグに置き換えています。これはTextViewを継承したものなので、プログラムコード中では普通のTextViewとして扱って問題ありません。

AppCompatTextView側で

android:layout_width="0dp"
android:layout_weight="1"

とすることで、このLinearLayout内でtext_name側を左詰め、text_number側を右詰めにすることができます。また、

android:maxLines="1"

を入れないと、長いテキストとしたときにTextView内で改行して折り返されてしまいます。

肝心のAutoSizing TextViewsの機能を定義する属性の意味は次の通りです。

app:autoSizeTextType="uniform" オートサイズを使う
app:autoSizeMaxTextSize="24sp" 最大フォントサイズは24spとする
app:autoSizeMinTextSize="1sp" 最小フォントサイズは1spとする

ざっとですがこのような感じです。画像で示した例は、これを3段重ねにしただけです。Javaコードはプロジェクト作成時に作られたそのままで一切操作していません。恐らく、資料としてご覧になったサイズ調整のためのTextView継承クラスでは、ループしながらはみ出ないサイズを探すような作業をしていたかと思いますが、そういう面倒が必要なくなりました。

この機能がAPI 26でようやく新規に実装されたのは遅すぎますよね。質問にあった「いろんな機能が詰まっているAndroidに、リサイズプロパティが本当にないのか?」という言葉、私もGoogleに聞いてもらいたいです。


(13:50)
XMLで間違えてしまったところがあったので修正しています。


この質問を後日閲覧した方に向けて補足。

上記の例ではAppCompatTextViewを用いているのですが、GoogleのドキュメントではSupport Libraryを適用する場合でも普通のTextViewで良いような書き方になっています。実際にTextViewにしてみると、デザインビューでの描画がおかしくなったりapp属性に赤波線が入ったりと不審な動作をするのですが、ビルドは通りますし実行すると端末上では想定通り動いてしまいます。
赤波線が表示されている様子

これがAndroid Studioのバグなのか何なのか、私もよくわかりません。ネット上の資料でAppCompatTextViewに置き換えたものが数多く見られることからそれを模倣したに過ぎないものなので、根拠は薄いです。以上。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/29 11:29

    ご丁寧な返信ありがとうございます。
    さらに、実装までしていただき有難うございます。。。

    まさしく、添付頂いた写真の通りで実現したいです。

    ただ、ユーザーがAPI26をまだあまり手にしていない事を考えると、API26でしか使えない実装はどうなんだろうと言う不安もあります…。

    キャンセル

  • 2017/09/29 15:33

    大変丁寧な回答有難うございます!
    早速実装して見ました。

    当初の思惑通りの実装ができました。

    ご教授頂いた方法でサポートライブラリーを入れる事で、SDK17でも動作確認をする事ができました。

    ありがとうございます!

    キャンセル

+2

ちなみに上記でkeicha_hrsさんが答えている内容ですが、こちらの記事にあるように、サポートライブラリでTextViewCompatというクラスを使えば、API14から使用できると書いてあります。

The Support Library 26.0 provides full support to the autosizing TextView feature on devices running Android versions prior to Android 8.0 (API level 26). The library provides support to Android 4.0 (API level 14) and higher. The android.support.v4.widget package contains the TextViewCompat class to access features in a backward-compatible fashion.

ですので、こちらのクラスを使用して各プロパティをsetすれば良いのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/29 13:52

    これはXMLで記述するかJavaコードで記述するかの違いだけですね。できることは同じです。

    キャンセル

  • 2017/09/29 14:33

    試してみたけど、ほぼこれで同義なのかなあ?MaxとMinの単位がspからpxになっているので、ちょっと値が違いますが。
    TextView textView = findViewById(R.id.text_name1);
    TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
    textView, 3, 63, 1, TypedValue.COMPLEX_UNIT_PX);

    キャンセル

  • 2017/09/29 15:37

    ご回答ありがとうございます。
    XMLで実装して、API17で評価して見ましたが無事動作しました。

    コードでも実装して見ましたが、確かに記事通り動作はしました!

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    14049questions

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

  • Android

    6618questions

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

  • Android Studio

    3775questions

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