📱

AlertDialogのボタンが全部大文字になってしまう現象とその対処

2023/05/05に公開

課題

こののようなコードのとき

AlertDialog.Builder(requireContext())
  .setTitle("Title")
  .setMessage("Body")
  .setPositiveButton("Googleログインする") { _, _ ->
    // TODO: Impl
  }
  .setNegativeButton("Cancel") { _ , _ ->
    // do nothing
  }
  .show()

コードを見ると以下のようなダイアログが表示されるように思うが

実際に表示されるダイアログは以下のように、ボタンの文言のアルファベットがすべて大文字になってしまう。

解決策

サクッと解決したいならばshowした後にgetButtonをしてisAllCapsをfalseしてやればよい。

AlertDialog.Builder(requireContext())
  .setTitle("Title")
  .setMessage("Body")
  .setPositiveButton("Googleログインする") { _, _ ->
    // TODO: Impl
  }
  .setNegativeButton("Cancel") { _, _ ->
    // do nothing
  }.create().apply {
    this.show()
    this.getButton(AlertDialog.BUTTON_POSITIVE).isAllCaps = false
    this.getButton(AlertDialog.BUTTON_NEGATIVE).isAllCaps = false
  }

無事に小文字は小文字として表示されるようになる。

こんな感じでボタンの色を変えられたりもします。
以下はあまりさせたくない方のアクションの色を弱めている例。

getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(
  ContextCompat.getColor(
    requireContext(),
    R.color.black_54
  )
)

ちなみにこれは対症療法でしかなく、styles.xmlでDialogのThemeを編集するのが正攻法だと思います。
http://y-anz-m.blogspot.com/2019/08/alertdialog-negative.html

参考

https://stackoverflow.com/questions/31663856/android-how-to-make-ok-button-on-dialog-not-all-caps

Discussion