Androidでは、String.format(text, value)としてテキストを出力させるが、iOSの場合もほぼ同じでStringのコンストラクタに入れるだけ。
let number = 3
let numberString = String(format: "%03d", number) // 003
Androidでは、String.format(text, value)としてテキストを出力させるが、iOSの場合もほぼ同じでStringのコンストラクタに入れるだけ。
let number = 3
let numberString = String(format: "%03d", number) // 003
iOSでよくあるアラートダイアログを表示する。
let alert = UIAlertController(title: "タイトルテスト", message: "メッセージテスト", preferredStyle: .alert)
// ボタンを追加する
let action = UIAlertAction(title: "ボタン", style: .default, handler: { action in
/** do something **/
})
// 以下で、ボタンとそのタップ処理を追加する。ボタンは複数追加できる。
alert.addAction(action)
// 表示
present(alert, animated: true)
presentがライフサイクル上でコールするのが早すぎると無視されるので、viewDidAppear()以降のタイミングで呼ぶこと。
enumの定義に、CaseIterable を実装してあげるだけ。
enum Size: CaseIterable {
case maximum
case big
case medium
case small
case minimum
}
ってやると、allCasesにアクセスできるようになる
Size.allCases.map { /* do something. */ }
firstIndexでインデックスもとれるようになる
Size.firstIndex(of: .big)!
引数付きString(format:, _ arguments)のイニシャライザの使い方
let month = "12"
let day = "31"
let text = String(format: "%@月%@日", month, day)
print(text)
毎回毎回、
署名キー探して、
設定値を入力してビルドして
aabファイル生成して
プレイストアにアップロードして
ってフローが面倒になった。どうにかならないものか。
少なくても、署名キー探す~aabファイル生成するまでを自動化できることは知っているけど、例えばGitHubActionでやるなら生成したaabファイルや署名キーを秘匿にしないといけない都合でリポジトリも秘匿にしないといけないし、でもそれを秘匿にするのは正直あまりうれしくない(できるだけパブリックにしておきたい)。どうにかならないものか。
って考えたときに、「ソースを管理する領域(GitHub)とaabファイル生成をする領域を別にすればいいんじゃん。そうすればソースはパブリックのままでいいし、署名キーやら生成したaabファイルやらも秘匿の状態を保てる。とても幸せやん。」と気づいた。
上記を整理すると以下のフローとなる。
素敵だ。上記フローを実現するために必要な調査は★1,2の内容。
まあ、「そんなのありません」ってことはないんだろうけどね。特に★1については「サービスとしてはあるけど、有料会員様限定のサービスなんすよ」かもしれないし。
というわけで、考えていることでした。調査した結果とか、更新があればまた改めて投稿します。
Xcodeのプロジェクトで設定した証明書ファイル群にデバッグビルドによるビルドができるような設定になっていない。
どうも。どっことです。今回はXML上でクリックリスナーを設定する実装方法について解説します。
dataBindingでは、XMLでクリックリスナーを設定する処理はよくある実装ですが、実はdataBindingを使わない通常のケースでも似たような実装をすることができます。
XMLでクリックリスナーを設定するには、任意のViewに対して
android:onClickを設定してあげます。たとえば、TextViewに設定するときは以下のような形です。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="テスト"
android:onClick="testClicked" />
あとはこのXMLを読み込むクラスに、testClicked(View v)関数を実装します。
override fun testClicked(v: View) {
Log.d("TAG", "TextView テスト is clicked")
}
今回設定したonClickの値はtestClickedなのでそれに合わせていますが、実際に利用する際はTextViewがどんな表示をしているかなどを表現した関数名にしてあげると後々にコードを追いやすくなるかと思います。
今回はXMLでクリックリスナーを設定する実装方法について解説しました。dataBindingでも似たような実装方法があると思いますが、そうでなくてもシンプルに利用することができるので、参考にしていただけると幸いです。
どうも。どっことです。今回はダークモード対応に関する実装について解説します。
アプリをいい感じに見せたいのであれば、ダークモード対応は今や必須の項目の一つではないでしょうか。ユーザへの見せ方をライト/ダークでそれぞれ管理する必要があるのは大変ですが、それ以上にユーザに好印象を与えることができるアプローチになります。今回はそんなダークモード対応をする時のアプローチ方法を解説します。
必要最小限でダークモードを対応する場合、以下の手順になります。
順番に解説していきます。
まずは以下をApplication#onCreate()で呼び出してみましょう。
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
これを呼び出すとアプリがダークモードで表示されます。この状態でアプリがどのように見えるか確認しましょう。
テキストが背景と同色で見えなくなっているなど、残念な表示となっている箇所は適宜修正しましょう。values-nightフォルダを作ってそこにcolors.xmlを用意し、色指定を追加してください。このときvalues/colors.xmlでの定義とvalues-night/colors.xmlで定義するnameは同じものを指定してください。そうすれば、ライト/ダークの切り替え時にそれぞれの色指定を参照してくれます。逆に異なるものを指定すると、ビルド時に警告表示されるはずです。
あとはユーザがライト/ダークモード(+端末の設定に従う設定)を切り替えられるよう、切り替えスイッチのような動線を用意しておきましょう。アプリ内に設定画面などがあれば、そちらに用意するのが適切かと思います。
ユーザがスイッチなどで設定を変えた場合の処理が必要です。ユーザの切り替え設定に従い、テーマを更新します。また、設定した値はアプリ固有領域(例えばSharedPreferenceなど)に保持しておきましょう。以下はSharedPreferenceに保存した時のサンプルです。
/**
* ユーザが設定したテーマ。
* AppCompatDelegate.MODE_NIGHT_YES,
* AppCompatDelegate.MODE_NIGHT_NO など
**/
val value = AppCompatDelegate.MODE_NIGHT_YES
AppCompatDelegate.setDefaultNightMode(value)
getSharedPreferences("sample", MODE_PRIVATE)
.edit().putInt("theme_setting", value).apply()
アプリを起動した時に、ユーザの設定に合わせてテーマを更新する必要があります。先ほど実装したApplication#onCreate()の実装を以下に変更してください。
val value = getSharedPreferences("sample", MODE_PRIVATE)
.getInt("theme_setting", AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
AppCompatDelegate.setDefaultNightMode(value)
今回は、アプリにダークモードを実装する時の実装手順について解説しました。ダークモードはユーザに良い印象を提供するためには必須の項目となっているので、今回の内容を参考にして是非対応してみてください。
どうも。どっことです。 タイトルの通りですが、諸事情により GitHubPage に移行予定です。 https://mkt120.github.io/ この備忘録に記載の内容を転記しつつ、今後はこちらのページを更新していく予定です。