Compose 1.8 から Autofill(自動入力)が使えるようになりました。
ただ、その Autofill の有効・無効が Activity の名前に応じて変わる 事象を観測したので記事に残します。
検証コード
Activity の名前の違いだけに着目したかったので、 BaseActivity
を作成し中身は全く一緒で Activity の名前だけが異なるように準備しました。
Composable もテキスト入力欄が中央に配置されているシンプルなものです。
abstract class BaseActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ComposeAutofillSampleTheme {
BaseScreen()
}
}
}
}
@Composable
private fun BaseScreen() {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
var email by remember { mutableStateOf("") }
Box(
modifier = Modifier
.padding(innerPadding)
.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
TextField(
value = email,
onValueChange = { email = it },
)
}
}
}
Activity は継承するだけ。
class EmailActivity : BaseActivity()
class InputEmailActivity : BaseActivity()
class LoginEmailActivity : BaseActivity()
// ...
画面の見た目としてはこのような感じ。
MainActivity | BaseActivity |
---|---|
![]() |
![]() |
※ 以下のリポジトリに検証にて使ったコードを UP しているので、細かい点はそちらを参照ください。
検証結果
Pixel 8a (Android 15)を使用して検証しました。
EmailActivity
と InputEmailActivity
は「自動入力」を押しても「コンテンツを自動入力できません」となりましたが、LoginEmailActivity
はメールアドレスが候補として出てくる結果に…
EmailActivity | InputEmailActivity | LoginEmailActivity |
---|---|---|
![]() |
![]() |
![]() |
他の名前も一通り試したところ以下のような結果となりました。
Activity名 | Autofill |
---|---|
EmailActivity | 無効 |
LoginActivity | 無効 |
InputActivity | 無効 |
InputEmailActivity | 無効 |
LoginEmailActivity | 有効 |
SignUpEmailActivity | 有効 |
RegisterEmailActivity | 有効 |
PasswordResetEmailActivity | 無効 |
「メールアドレスを登録する」的なニュアンスの場合に Autofill が有効となるのか…?
ちなみに別の端末で確認すると、Pixel 8a では無効だった Activity が有効になっているなどありました。
そもそも contentType
を指定せずに Autofill が動いている…
Activity の名前の違いで挙動が変わって困惑しているところですが、新たな謎が…。
そもそもドキュメントには contentType
の指定をすることで Autofill が有効になると記載がありますが、検証コードでは指定しなくても Autofill が有効 になりました。
で、軽く試した感じ、有効になったのを無効にする方法はなさそうな印象でした。( Activity の名前を変える以外)
TextField(
value = textFieldValue.value,
onValueChange = {textFieldValue.value = it},
modifier = Modifier.semantics {
contentType = ContentType.Username // ← これが検証コードでは未指定
}
)
まぁ基本的には問題ない気もしますが、例えば、やんごとなき理由で Autofill を使いたくない、という状況においても Activity の名前のせいで勝手に Autofill が有効になってしまう ということになりそうです。
まとめ
自分が何かを取り違えているのか、この挙動は Android では一般的なのか、はたまた夏の幻なのか…
Autofill を有効にする場合 Modifier.semantics
を指定するので、Activity の名前もセマンティクスの情報として扱われている?とか推測しますが、とりあえず「Android なにもわからない」という気持ちです。
この記事の内容がどこかの誰かの役に立てば幸いです。
P.S. Single Activity にしろというお告げなのかもしれない。