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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

8037閲覧

TextViewのリサイズ

SmartBuzz

総合スコア81

Java

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

Android

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

Android Studio

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

0グッド

1クリップ

投稿2017/09/27 06:19

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

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

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

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

xml

1<RelativeLayout 2 <LinearLayout 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 android:orientation="horizontal"> 6 7 <TextView 8 android:id="@+id/text_no" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:textSize="10dp" 12 android:text="10"/> 13 14 </LinearLayout> 15 <LinearLayout 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:orientation="horizontal"> 19 20 <TextView 21 android:id="@+id/text_name" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:textSize="20dp" 25 android:text="アイウエオカキクケコ"/> 26 27 <TextView 28 android:id="@+id/text_number" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:paddingLeft="@dimen/text_padding" 32 android:textSize="10dp" 33 android:text="10000m(10km)"/> 34 35 </LinearLayout> 36</RelativeLayout>

と、XMLに書いています。

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

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

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

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

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

このような感じです。

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

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

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

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

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

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

guest

回答2

0

ちなみに上記で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 03:47

hiramekun

総合スコア428

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

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

keicha_hrs

2017/09/29 04:52

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

2017/09/29 05:33

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

2017/09/29 06:37

ご回答ありがとうございます。 XMLで実装して、API17で評価して見ましたが無事動作しました。 コードでも実装して見ましたが、確かに記事通り動作はしました!
guest

0

ベストアンサー

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:<プロジェクト名>) の方に下記のようにリポジトリーのアドレスを入力します。

gradle

1allprojects { 2 repositories { 3 jcenter() 4 maven { url 'https://maven.google.com' } 5 } 6}

なお、上記に相当する記述は、まもなく正式リリースされる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のバージョンを今日現在の最新版にするため、次のようにします。

gradle

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

準備はここまで。

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

XML

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

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

XML

1 <LinearLayout 2 android:id="@+id/linearLayout1" 3 android:layout_width="240dp" 4 android:layout_height="24dp" 5 android:layout_alignParentStart="true" 6 android:orientation="horizontal"> 7 8 <android.support.v7.widget.AppCompatTextView 9 android:id="@+id/text_name1" 10 android:layout_width="0dp" 11 android:layout_height="match_parent" 12 android:layout_weight="1" 13 android:gravity="center_vertical" 14 android:maxLines="1" 15 android:text="アイウエオ" 16 app:autoSizeMaxTextSize="24sp" 17 app:autoSizeMinTextSize="1sp" 18 app:autoSizeTextType="uniform" /> 19 20 <TextView 21 android:id="@+id/text_number1" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:layout_gravity="center_vertical" 25 android:text="10000m(10km)" 26 android:textSize="12sp" /> 27 </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/28 14:22

編集2017/09/29 12:44
keicha_hrs

総合スコア6768

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

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

SmartBuzz

2017/09/29 02:29

ご丁寧な返信ありがとうございます。 さらに、実装までしていただき有難うございます。。。 まさしく、添付頂いた写真の通りで実現したいです。 ただ、ユーザーがAPI26をまだあまり手にしていない事を考えると、API26でしか使えない実装はどうなんだろうと言う不安もあります…。
SmartBuzz

2017/09/29 06:33

大変丁寧な回答有難うございます! 早速実装して見ました。 当初の思惑通りの実装ができました。 ご教授頂いた方法でサポートライブラリーを入れる事で、SDK17でも動作確認をする事ができました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問