回答編集履歴

6

AppCompatTextViewについての補足を追加(後日閲覧者向け)

2017/09/29 12:44

投稿

keicha_hrs
keicha_hrs

スコア6766

test CHANGED
@@ -225,3 +225,21 @@
225
225
  (13:50)
226
226
 
227
227
  XMLで間違えてしまったところがあったので修正しています。
228
+
229
+
230
+
231
+ ---
232
+
233
+
234
+
235
+ この質問を後日閲覧した方に向けて補足。
236
+
237
+
238
+
239
+ 上記の例ではAppCompatTextViewを用いているのですが、GoogleのドキュメントではSupport Libraryを適用する場合でも普通のTextViewで良いような書き方になっています。実際にTextViewにしてみると、デザインビューでの描画がおかしくなったりapp属性に赤波線が入ったりと不審な動作をするのですが、ビルドは通りますし実行すると端末上では想定通り動いてしまいます。
240
+
241
+ ![赤波線が表示されている様子](242884052fe7d73f4272482fd656921c.png)
242
+
243
+
244
+
245
+ これがAndroid Studioのバグなのか何なのか、私もよくわかりません。ネット上の資料でAppCompatTextViewに置き換えたものが数多く見られることからそれを模倣したに過ぎないものなので、根拠は薄いです。以上。

5

間違いがあったので修正

2017/09/29 12:44

投稿

keicha_hrs
keicha_hrs

スコア6766

test CHANGED
@@ -146,7 +146,7 @@
146
146
 
147
147
  app:autoSizeMaxTextSize="24sp"
148
148
 
149
- app:autoSizeStepGranularity="1sp"
149
+ app:autoSizeMinTextSize="1sp"
150
150
 
151
151
  app:autoSizeTextType="uniform" />
152
152
 
@@ -206,11 +206,7 @@
206
206
 
207
207
  app:autoSizeMaxTextSize="24sp" 最大フォントサイズは24spとする
208
208
 
209
- app:autoSizeStepGranularity="1sp" フォントサイズの調整は1sp刻みとする
209
+ app:autoSizeMinTextSize="1sp" 最小フォントサイズは1spとする
210
-
211
-
212
-
213
- ここでは使いませんでしたが、app:autoSizeMinTextSizeという属性を設けて、最小フォントサイズを指定することもできます。
214
210
 
215
211
 
216
212
 
@@ -219,3 +215,13 @@
219
215
 
220
216
 
221
217
  この機能がAPI 26でようやく新規に実装されたのは遅すぎますよね。質問にあった「いろんな機能が詰まっているAndroidに、リサイズプロパティが本当にないのか?」という言葉、私もGoogleに聞いてもらいたいです。
218
+
219
+
220
+
221
+ ---
222
+
223
+
224
+
225
+ (13:50)
226
+
227
+ XMLで間違えてしまったところがあったので修正しています。

4

何度も修正しています・・・

2017/09/29 04:50

投稿

keicha_hrs
keicha_hrs

スコア6766

test CHANGED
@@ -82,12 +82,38 @@
82
82
 
83
83
 
84
84
 
85
- 本題のレイアウトXMLの記述ですが、1行分でこような感じです。LinearLayoutの幅と高さ固定たのは見易さのためなので、この値でなければならないことはありせん
85
+ 本題のレイアウトXMLの記述ですが、まず外側となるレイアウト属性にxmlns:app追加しま
86
86
 
87
87
 
88
88
 
89
89
  ```XML
90
90
 
91
+ <?xml version="1.0" encoding="utf-8"?>
92
+
93
+ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
94
+
95
+ xmlns:app="http://schemas.android.com/apk/res-auto"
96
+
97
+ xmlns:tools="http://schemas.android.com/tools"
98
+
99
+ android:layout_width="match_parent"
100
+
101
+ android:layout_height="match_parent"
102
+
103
+ android:orientation="vertical"
104
+
105
+ tools:context="com.example.autosizingsample.MainActivity">
106
+
107
+ ```
108
+
109
+
110
+
111
+ テキストの1行分はこのような感じです。LinearLayoutの幅と高さを固定したのは見易さのためなので、この値でなければならないことはありません。
112
+
113
+
114
+
115
+ ```XML
116
+
91
117
  <LinearLayout
92
118
 
93
119
  android:id="@+id/linearLayout1"
@@ -146,8 +172,6 @@
146
172
 
147
173
 
148
174
 
149
-
150
-
151
175
  左側のTextViewはSupport Libraryが提供するものを用いるため、TextViewタグの代わりにandroid.support.v7.widget.AppCompatTextViewタグに置き換えています。これはTextViewを継承したものなので、プログラムコード中では普通のTextViewとして扱って問題ありません。
152
176
 
153
177
 

3

文章修正

2017/09/29 03:41

投稿

keicha_hrs
keicha_hrs

スコア6766

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

2

ちょっと追記

2017/09/29 03:29

投稿

keicha_hrs
keicha_hrs

スコア6766

test CHANGED
@@ -190,4 +190,8 @@
190
190
 
191
191
 
192
192
 
193
+ ざっとですがこのような感じです。画像で示した例は、これを3段重ねにしただけです。Javaコードはプロジェクト作成時に作られたそのままで一切操作していません。恐らく、資料としてご覧になったサイズ調整のためのTextView継承クラスでは、ループしながらはみ出ないサイズを探すような作業をしていたかと思いますが、そういう面倒が必要なくなりました。
194
+
195
+
196
+
193
- ざっとですがな感じです。
197
+ この機能がAPI 26ようやく新規に実装されたのは遅ぎますよね。質問にあった「いろんな機能詰まっているAndroidに、リサイズプロパティが本当にないか?」とい言葉、私もGoogleに聞いてもらいたいです。

1

詳細解説を追記する

2017/09/29 03:26

投稿

keicha_hrs
keicha_hrs

スコア6766

test CHANGED
@@ -11,3 +11,183 @@
11
11
 
12
12
 
13
13
  なんか大ファールの可能性もありそうなので、コードの提示はご返信いただいてからにさせてください(大外れだったら恥ずかしいので・・・)。
14
+
15
+
16
+
17
+ ---
18
+
19
+
20
+
21
+ これでご希望通りということなので、詳細を追記します。なお、API 26から追加された機能ではありますが、Android Support Libraryによって過去のAndroidバージョンの端末でも動作させられます。
22
+
23
+
24
+
25
+ API 26の機能なので、Android 8.0(API 26)のSDK Platformのインストールは必須です。
26
+
27
+
28
+
29
+ 過去のAndroidバージョンでも動作させるためにappcompat-v7:26.0.0以上のSupport Libraryを適用する必要がありますが、これを入手するためにbuild.gradle(Project:<プロジェクト名>) の方に下記のようにリポジトリーのアドレスを入力します。
30
+
31
+
32
+
33
+ ```gradle
34
+
35
+ allprojects {
36
+
37
+ repositories {
38
+
39
+ jcenter()
40
+
41
+ maven { url 'https://maven.google.com' }
42
+
43
+ }
44
+
45
+ }
46
+
47
+ ```
48
+
49
+
50
+
51
+ なお、上記に相当する記述は、まもなく正式リリースされるAndroid Studio 3.0ではプロジェクト作成のときに自動で行われるようになるので、必要なくなります。2.3.3の間だけ必要な作業です。
52
+
53
+
54
+
55
+ 次にbuild.gradle(app)の方を編集します。私が試した環境では、次のようにしました。
56
+
57
+ - compileSdkVersion 26
58
+
59
+ - minSdkVersion 19
60
+
61
+ - targetSdkVersion 26
62
+
63
+
64
+
65
+ minSdkVersionはもっと下げることもできるでしょうが、下げ過ぎると次のXMLの属性で使えないものが出てくる可能性があります。ここでは19としたので、Android 4.4以上の端末で動くアプリということになります。
66
+
67
+
68
+
69
+ dependenciesの中にあるappcompat-v7のバージョンを今日現在の最新版にするため、次のようにします。
70
+
71
+
72
+
73
+ ```gradle
74
+
75
+ compile 'com.android.support:appcompat-v7:26.1.0'
76
+
77
+ ```
78
+
79
+
80
+
81
+ 準備はここまで。
82
+
83
+
84
+
85
+ 本題のレイアウトXMLの記述ですが、1行分でこのような感じです。LinearLayoutの幅と高さを固定したのは見易さのためなので、この値でなければならないことはありません。
86
+
87
+
88
+
89
+ ```XML
90
+
91
+ <LinearLayout
92
+
93
+ android:id="@+id/linearLayout1"
94
+
95
+ android:layout_width="240dp"
96
+
97
+ android:layout_height="24dp"
98
+
99
+ android:layout_alignParentStart="true"
100
+
101
+ android:orientation="horizontal">
102
+
103
+
104
+
105
+ <android.support.v7.widget.AppCompatTextView
106
+
107
+ android:id="@+id/text_name1"
108
+
109
+ android:layout_width="0dp"
110
+
111
+ android:layout_height="match_parent"
112
+
113
+ android:layout_weight="1"
114
+
115
+ android:gravity="center_vertical"
116
+
117
+ android:maxLines="1"
118
+
119
+ android:text="アイウエオ"
120
+
121
+ app:autoSizeMaxTextSize="24sp"
122
+
123
+ app:autoSizeStepGranularity="1sp"
124
+
125
+ app:autoSizeTextType="uniform" />
126
+
127
+
128
+
129
+ <TextView
130
+
131
+ android:id="@+id/text_number1"
132
+
133
+ android:layout_width="wrap_content"
134
+
135
+ android:layout_height="wrap_content"
136
+
137
+ android:layout_gravity="center_vertical"
138
+
139
+ android:text="10000m(10km)"
140
+
141
+ android:textSize="12sp" />
142
+
143
+ </LinearLayout>
144
+
145
+ ```
146
+
147
+
148
+
149
+
150
+
151
+ Support Libraryが提供するTextViewを用いるため、TextViewタグの代わりにandroid.support.v7.widget.AppCompatTextViewタグに置き換えています。これはTextViewを継承したものなので、プログラムコード中では普通のTextViewとして扱って問題ありません。
152
+
153
+
154
+
155
+ AppCompatTextView側で
156
+
157
+
158
+
159
+ android:layout_width="0dp"
160
+
161
+ android:layout_weight="1"
162
+
163
+
164
+
165
+ とすることで、このLinearLayout内でtext_name側を左詰め、text_number側を右詰めにすることができます。また、
166
+
167
+
168
+
169
+ android:maxLines="1"
170
+
171
+
172
+
173
+ を入れないと、長いテキストとしたときにTextView内で改行して折り返されてしまいます。
174
+
175
+
176
+
177
+ 肝心のAutoSizing TextViewsの機能を定義する属性の意味は次の通りです。
178
+
179
+
180
+
181
+ app:autoSizeTextType="uniform" オートサイズを使う
182
+
183
+ app:autoSizeMaxTextSize="24sp" 最大フォントサイズは24spとする
184
+
185
+ app:autoSizeStepGranularity="1sp" フォントサイズの調整は1sp刻みとする
186
+
187
+
188
+
189
+ ここでは使いませんでしたが、app:autoSizeMinTextSizeという属性を設けて、最小フォントサイズを指定することもできます。
190
+
191
+
192
+
193
+ ざっとですがこのような感じです。