5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Jetpack Compose】Autofill の有効・無効が Activity の名前に応じて変わる件

Posted at

Compose 1.8 から Autofill(自動入力)が使えるようになりました。

ただ、その Autofill の有効・無効が Activity の名前に応じて変わる 事象を観測したので記事に残します。

検証コード

Activity の名前の違いだけに着目したかったので、 BaseActivity を作成し中身は全く一緒で Activity の名前だけが異なるように準備しました。

Composable もテキスト入力欄が中央に配置されているシンプルなものです。

BaseActivity.kt
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 は継承するだけ。

Activities.kt
class EmailActivity : BaseActivity()

class InputEmailActivity : BaseActivity()

class LoginEmailActivity : BaseActivity()

// ...

画面の見た目としてはこのような感じ。

MainActivity BaseActivity
main.png base.png

※ 以下のリポジトリに検証にて使ったコードを UP しているので、細かい点はそちらを参照ください。

検証結果

Pixel 8a (Android 15)を使用して検証しました。

EmailActivityInputEmailActivity は「自動入力」を押しても「コンテンツを自動入力できません」となりましたが、LoginEmailActivity はメールアドレスが候補として出てくる結果に…

EmailActivity InputEmailActivity LoginEmailActivity
EmailActivity.gif InputEmailActivity.gif LoginEmailActivity.gif

他の名前も一通り試したところ以下のような結果となりました。

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 にしろというお告げなのかもしれない。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?