2023年12月22日金曜日

Mac ホットコーナーをカスタマイズする方法を解説

どうも。どっことです。今回は、Macのホットコーナーのカスタマイズについて解説します。

Macのホットコーナーをカスタマイズする

Macを使っていると右下にカーソルを当てるとクイックメモが表示されますが、ショートカットやアイコンなどの位置によっては、煩わしさを感じる人も多いと思います。私もそのうちのひとりでした。どうにか表示されないようにできないかなと調べたので、紹介します。

設定方法

手順は簡単で、Macの設定から以下を設定してあげれば解決します。

  • システム設定 > デスクトップとDock > ホットコーナー > 右下を - に設定

調べたら、MissionControlも設定することができました。

  • ホットコーナー > 右上を MissionControl に設定

参考

2023年12月15日金曜日

Android ソフトキーボードを閉じる実装について解説

どうも。どっことです。今回はAndroidでキーボードを閉じる実装を解説します。

ソフトキーボードを閉じる実装

以前このブログで、iOSでのキーボードを閉じる実装について解説しました。今回はそのAndroid版です。

解説

さっそくサンプルを載せます。InputMethodManagerにアクセスし、キーボードを閉じるようhideSoftInputFromWindowで依頼する、という具合ですね。

val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as? InputMethodManager
inputMethodManager?.hideSoftInputFromWindow(v.windowToken, 0)

「いうほど難しいか?」と言われればそうでもなさそうですが、
「キーボード消すの、どのマネージャーに依頼するんだっけ...?」とか
InputMethodManagerに依頼するのはいいけど、どのメソッドだっけ...?」とか
「引数には何を渡すんだっけ..」とか、ちょっとした煩わしさが見え隠れしているように感じます。。

まとめ

今回はAndroidでソフトウェアキーボードを閉じる実装方法について解説しました。表示されるべき時に表示され、消えるべき時に消えるあるべき姿が、ユーザに良い体験を提供する考え方なので、意識していきましょう。

Android アプリ内にXMLを組み込む/読み込む実装を解説

どうも。どっことです。今回は、アプリ内へのXML組み込み/読み込みをする実装について解説します。

XMLをアプリ内に埋め込む・読み込む

AndroidのリソースにはXMLを配置することができます。AndroidResourceよりも単純なファイル管理として扱えるので、アプリの共通設定などの管理に利用することができます。

実際に配置する場所はapp/res/xmlフォルダです。無い場合は新規に追加して、XMLファイルを配置してください。

例えばsample.xmlを配置した場合、参照する時は以下のようにXMLファイルを指定します。

val parser : XmlResourceParser = context.resources.getXml(R.xml.sample)

Android開発ではAndroidResourceがよしなにやってくれるので、XmlResourceParserは使い馴染みのない人が多いかもしれませんが、getEventType()/next()を駆使してIterableのように解析するものです。

var eventType: Int = parser.getEventType();
// XMLドキュメントが終了になるまでwhile文を繰り返す
while (eventType != XmlPullParser.END_DOCUMENT) {
    if(eventType == XmlPullParser.START_DOCUMENT) {
        System.out.println("XMLドキュメントの読み取り開始");
    } else if(eventType == XmlPullParser.START_TAG) {
        System.out.println("新しいタグの参照:"+parser.getName());
    } else if(eventType == XmlPullParser.END_TAG) {
        System.out.println("タグが閉じられた:"+parser.getName());
    } else if(eventType == XmlPullParser.TEXT) {
    // タグに設定されている値を参照
        System.out.println("値:"+parser.getText());
    }
    // 次の要素の参照へ
    eventType = parser.next();
}

まとめ

今回はアプリ内にXMLを組み込み、それを参照する実装方法について解説しました。アプリの設定管理などの1案として挙げられるので、有効活用していきたいですね。

参考

Android 現在表示しているActivityやFragmentを確認するコマンドを紹介

どうも。どっことです。今回は、現在表示しているActivityFragmentを確認するためのコマンドを紹介します。

表示中のActivity/Fragmentを確認する

Androidアプリの開発中に「今表示しているActivityFragmentはなんだ...?」と調べる機会があったので、調べた結果を紹介します。

表示しているActivityやFragmentを確認する

Activityを確認する

以下のコマンドで確認できます。

$ adb shell dumpsys activity top

Fragmentを確認する

以下のコマンドで確認できます。

$ adb shell dumpsys activity top | grep 'Added Fragments' -A 10

まとめ

今回は表示しているActivityFragmentを確認するためのコマンドを紹介しました。Android Studioを使っているだけではあまり知る機会のないものですが、開発・デバッグに活かしていきたいですね。

参考

groupId,artifactIdについて解説

どうも。どっことです。今回はgroupIdartifactIdについて解説します。

groupIdとは?

他のすべてのプロジェクトと区別するためのID。グループを表現したID。一般的にはドメイン名を逆にしたものが挙げられる。例えばcom.exampleなど。自分のWebページなどがあるなら、それを使うのが無難そうです。

artifactIdとは?

プロジェクト名という表現がわかりやすい。ライブラリ名とかですね。

versionとは?

そのプロジェクトで管理しているバージョン。デフォルトで1.0-SNAPSHOTとなっているが、 フォーマットは決まっていない。

参考

2023年12月12日火曜日

Android テキスト周りの超細かい余白を取得する方法を解説

余白をテキストのピクセル単位でデザイン要求してくるデザイナー、絶対に許さない。

解説

テキストのベースラインから、上の余白(top, ascent)や下の余白(descentやbottom)をピクセル単位で取得することができます。この値を使って、数ピクセル単位の余白のズレも調整することができます。

val textPaint = Paint(Paint.ANTI_ALIAS_FLAG)
textPaint.setTextSize(12)
// FontMetricsの取得
val fontMetrics : FontMetrics = textPaint.getFontMetrics()
val topY = fontMetrics.top
val ascentY = fontMetrics.ascent
val descentY = fontMetrics.descent
val bottomY = fontMetrics.bottom

正直に言います。もう二度とやりたくありません。

参考

2023年12月4日月曜日

Android Kotlin Coroutineを並行に実行する実装を解説

どうも。どっことです。今回はKotlin Coroutineの並行実行する処理の実装方法について解説していきます。

Kotlin Coroutineを並列に実行する

非同期処理をとっても素敵に実装できるKotlin Coroutineですが、いくつかの処理を同時に実行したいようなケースにも対応することができます。APIによる通信やデータベースデータの永続化といった、時間がかかる処理をできるだけ短縮していきましょう。

実装方法

実装だけなら以下の2パターンで実現することができます。

async/awaitによる実装

ひとつはasync/awaitを使って実装する方法です。

viewModelScope.launch {
    val apiList = listOf(
        // async でコルーチンを生成 その中でAPIを実行する
        async { api1() },
        async { api2() },
        async { api3() },
    )
    // すべてのコルーチンを実行。全部終わるまで待つ。
    apiList.awaitAll()
}

launch/joinAllによる実装

もうひとつはlaunch/joinAllを使って実装する方法です。

viewModelScope.launch {
    // lanuch でコルーチンを作成し、その中でAPIを実行する。
    val apiJobsList = listOf(
        launch { api1() },
        launch { api2() },
        launch { api3() },
    )
    // すべてのコルーチンを実行。全部終わるまで待つ。
    apiJobsList.joinAll()
}

まとめ

今回は、Kotlin Coroutineによる処理を並列実行する実装について解説しました。ユーザの待ち時間を減らせるように活用していただけると幸いです。

参考

2023年12月1日金曜日

iOS UILabelの高さを可変にする実装方法を解説

どうも。どっことです。今回はiOSにおけるUILabelの高さを可変にする実装について解説していきます。

UILabelの高さを可変にする

Androidでいうところのandroid_height:"wrap_content"ですが、iOSではStoryBoard(AutoLayout)の都合上、Viewの高さを固定させなければならないことが非常に多いので、直感的にはできない印象です。ですが、できるんです。

そしてとても簡単で、numberOfLines0を設定し、sizeToFit()をコールするだけ。

label.numberOfLines = 0
label.text = "ここにはとても長いテキストが入ります。ここにはとても長いテキストが入ります。ここにはとても長いテキストが入ります。"
label.sizeToFit()

これだけで、UILabelの高さを可変にすることができます。

参考

移行予定

どうも。どっことです。 タイトルの通りですが、諸事情により GitHubPage に移行予定です。 https://mkt120.github.io/ この備忘録に記載の内容を転記しつつ、今後はこちらのページを更新していく予定です。