API 26から新たに導入された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/29 04:52
2017/09/29 05:33
2017/09/29 06:37