2024年3月30日土曜日

Gmail が Intent.selector に反応しない場合がある

手元の Pixel 8 では発生しないのだが、ユーザーさんの moto g13 (motorola penangf)(Android 13(SDK 33)) では、 val intent = Intent(Intent.ACTION_SEND) .putExtra(Intent.EXTRA_EMAIL, arrayOf(address)) .putExtra(Intent.EXTRA_SUBJECT, subject) .putExtra(Intent.EXTRA_TEXT, text) .apply { selector = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")) } startActivity(intent) この Intent は ActivityNotFoundException になってしまう。

selector を使わない次の方法なら ActivityNotFoundException にならない。 val intent = Intent(Intent.ACTION_SENDTO) .setData(Uri.parse("mailto:")) .putExtra(Intent.EXTRA_EMAIL, arrayOf(address)) .putExtra(Intent.EXTRA_SUBJECT, subject) .putExtra(Intent.EXTRA_TEXT, text) startActivity(intent)

2024年2月27日火曜日

Android Studio (IntelliJ IDEA) の Replace の正規表現モードを使う

例えば assertThat(answer).isEqualTo(2) を assertEquals(2, answer) に置き換えたい場合、Replace の正規表現モードを使うことで簡単に変換できる。

Cmd + Shift + R で Replace in Files window を開き、
(そのファイルだけ置き換えたいときは Cmd + R)
変換元を入力するフィールドの右端の 「.*」 部分をオンにする。

変換元に assertThat\((.*)\)\.isEqualTo\((.*)\) 変換先に assertEquals\($2, $1\) と入れて、Replace All ボタンを押すと全部置き換わる。便利!




2023年12月25日月曜日

InlineTextContent を使って Composable のテキスト中にアイコンを表示する

val id = "inlineContent" val inlineContent = mapOf( Pair( id, InlineTextContent( Placeholder( width = 1.em, height = 1.em, placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline ) ) { Icon(imageVector = Icons.Default.OpenInNew, contentDescription = null) } ) ) Text( text = buildAnnotatedString { append("open here") appendInlineContent(id, "[open in new]") }, inlineContent = inlineContent, fontSize = 24.sp, ) PlaceholderVerticalAlign で上下の位置を指定できる。中央揃えにするなら PlaceholderVerticalAlign.TextCenter がよさげ。