- 1. Androidでキーボードを閉じられたのを検知する方法
- 2. Androidでアプリ起動時にEditTextにフォーカスがあたらないようにする方法
- 3. AndroidのEditTextからフォーカスを外す方法
- 4. Flutter Flavor対応(パッケージ未使用)
- 5. onOptionsItemSelected の簡略化
- 6. ScrollableなComposableでコンテンツをレイアウトいっぱいに表示させる方法
- 7. 【M1 Pro/Max対応】M1 Mac環境構築ベストプラクティス
- 8. 【M1 Pro/Max対応】M1 MacにおけるAndroid開発環境構築
- 9. Jetpack Compose 枠線つきの角丸
- 10. RetrofitでDELETEメソッドに@Bodyつける
- 11. Jetpack Compose で追加読み込みに対応した LazyColumn を実装する
- 12. エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるアクセス制御モデル
- 13. 【React Native】FCMの設定でつまずいたこと(Androidのみ)
- 14. 【React Native】Androidでダークモードにするとアラートの文字が黒いままになってて見にくい
- 15. 【React Native】アプリ内でWebViewを表示する時のヘッダータイトルを動的に変更
- 16. [Kotlin]Android11での「他のアプリより上に重ねて表示」の権限許可対応
- 17. Jetpack Compose IntrinsicSize
- 18. THETAプラグインで手持ち/固定を判定する
- 19. Android12のFCM対応問題
- 20. Jetpack Composeのスクリーンショットを撮影する最小構成
Androidでキーボードを閉じられたのを検知する方法
# 概要
AndroidのEditTextを入力時、戻るボタンを押してキーボードを閉じたときに特定の処理を行いたいことがあった。
そのため、Androidで表示されているキーボードが閉じられたのを検知する方法を記載する。
言語はKotlin# キーボードが閉じられたのを検知する方法
以下のようにすることで、キーボードが戻るボタンで閉じられたのを検知できる。
“`kotlin
// EditTextを継承したクラスで以下を定義
override fun onKeyPreIme(key_code: Int, event: KeyEvent): Boolean {
if(key_code == KeyEvent.KEYCODE_BACK && evnet.action == KeyEvent.ACTION_UP) {
// TODO キーボードを閉じたときに実行したい処理を書く
}
return super.onKeyPreIme(key_code, event)
}
“`
Androidでアプリ起動時にEditTextにフォーカスがあたらないようにする方法
# 概要
Androidでアプリ作成時にアプリ起動時にEditTextにフォーカスがデフォルトであたっていた。
そのため、特定の端末ではアプリ起動時にキーボードが表示されてしまうという現象が発生した。
この現象を修正するために行った、起動時にEditTextにフォーカスがあたらないようにする方法を記載する。
アプリを作成する際に使用していた言語はKotlin# アプリ起動時にEditTextにフォーカスがあたらないようにする方法
AndroidのLayoutのxmlでEditTextの親のレイアウトに以下のコードを追加する。
こうすることでアプリ起動時にEditTextにフォーカスはあたらなくなる。“`xml
android:descendantFocusability=”beforeDescendants”
android:focusableInTouchMode=”true”
“`
AndroidのEditTextからフォーカスを外す方法
# 概要
AndroidのEditTextで入力を確定したあともフォーカスがそのまま残ることがあった。
入力確定後はEditTextからフォーカスは外れてほしい。
そのためAndroidでEditTextからフォーカスを外す方法を記載する。
言語はKotlin# フォーカスを外す
以下のコードを入力確定時のイベントで実行するようにすることでフォーカスが外れるようにすることができる。
“` Kotlin
val parent = parent as View
parent.isFocusable = true
parent.isFocusableInTouchMode = true
parent.requestFocus()
“`
Flutter Flavor対応(パッケージ未使用)
#内容
Flutter開発時にFlavorが導入されたプロジェクトに参画したり、他のメンバーがFlavorを導入した後にFlutterを触ったりすることはあったが、自分でFlavorを導入したことがなかったので、導入までの流れをまとめる。やり方は様々あるようですが、今回は、main_dev.dartとmain_prod.dartの2ファイルを作成する方法で行います。
#開発環境
PC:macOS Big Sur
エディター:Visual Studio Code, Android Studio, XcodeDart:2.13.1
Flutter:2.2.1
Visual Studio Code:1.16.2
Android Studio:4.1.2
Xcode:13.1その他
Flavorパッケージは未使用
今回は開発環境と本番環境を作成する。
それぞれの名前は以下のように統一している。(Android, iOS共に同じ名前を使用する。)
開発環境:dev
本番環境:prod#準備
以下のファイルを作成する。
・main_dev.dart
・main_pro
onOptionsItemSelected の簡略化
# ■ 概要
[onOptionsItemSelected()](https://developer.android.com/reference/android/app/Activity#onOptionsItemSelected(android.view.MenuItem)) は、もっと簡易な呼び出しがあっても良さそうな気がするので、試しに作ってみたという話。# ■ 仕様
本家で[こんな感じの説明](https://developer.android.com/guide/topics/ui/menus#RespondingOptionsMenu)がされているので、仕様を以下のようにしてみた:– 呼び出し方法
– itemId と、それに対応する処理を指定する。
– 実行内容
– 指定された itemId が対象だった場合は、対応する処理を実行し、問答無用で true を返し、super は呼ばない。
– 指定された itemId が対象でなかった場合は、super を呼び出す。# ■ 雰囲気
以下のような感じ。## ☆ 普通に書いた場合
“`kotlin
ScrollableなComposableでコンテンツをレイアウトいっぱいに表示させる方法
`verticalScroll` / `horizontalScroll`、`LazyColumn` / `LazyRow` などの Scrollable な Composable の中では、コンテンツのサイズが定まらないため `fillMaxSize` などを使用してレイアウトいっぱいに何かを表示させることができません。
例えばリストで空の表示を画面いっぱいに出したいとして以下のようなコードを実装してもテキストは真ん中に表示されません。
“`kotlin
@Composable
fun Sample() {
LazyColumn(
modifier = Modifier.fillMaxSize()
) {
item {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(t
【M1 Pro/Max対応】M1 Mac環境構築ベストプラクティス
# はじめに
2021/10/26にM1 Pro/Maxを搭載したMacBook Proが発売され、現在環境構築をされている方も多いかと思います。一方で、Pro/Maxも含めた**M1 Mac**はIntel Macと同じ方法でセットアップできないツールが多く、また公式未対応時のイレギュラーなセットアップ方法の記事がネット上に多く存在するため、**どのセットアップ方法が正しいのか判断するのが非常に難しい**状況となっています。
![独自インストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a6953011-924a-8d9b-8d63-c1fce4b6bad9.png)
そこで今回、私が調べた範囲で**現時点でのベストプラクティスと思われる方法**をまとめてみました。方法選択には主観も含まれているため、**「こちらの方が良い!」**という方法をご存じであれば、気軽にコメント頂けるとありがたいです
## 更新情報
本記事は**2021/10/30時点**での内容となります。
【M1 Pro/Max対応】M1 MacにおけるAndroid開発環境構築
# はじめに
[こちらの記事](https://qiita.com/c60evaporator/items/71a84e198fa078a4f956)でも触れましたが、M1 Macはイレギュラーなインストール方法のツールが多く、Android開発に使用するAndroid Studioもその例外ではなく、公式以外の方法でのインストールが必要な機能がいくつか存在していました。一方で公式側の対応も進んでおり、2021/10/30現在、ほぼ**公式ツールのみでセットアップが完結する**状況となっております。
そこで今回、**M1 Mac向けAndroid Studioのセットアップ方法**について記事にまとめようと思います。
# Android Studioのダウンロードとインストール
[Android Studioのダウンロードページ](https://developer.android.com/studio#downloads)にアクセスし、「Download options」をクリックします
![スクリーンショット 2021-10-28 22.36.53.png](https:/
Jetpack Compose 枠線つきの角丸
AndroidのJetpack Composeで大枠のComposeを枠線つきの角丸にする方法です。
この記事は以下のバージョンに対応しています。– Jetpack Compose: 1.0.4
– AndroidStudio: ArcticFox 2020.3.1 Patch 3# Viewの場合
Viewを枠線つきの角丸にする場合、下記のようなxmlファイルを作成し、Viewのbackgroundに定義しました。“`xml:rounded_corner_bg.xml
“`
RetrofitでDELETEメソッドに@Bodyつける
# 問題
retrofit使ってたらこんなエラーが出た“`
android retrofit non-body http method cannot contain @body.
“`DELETEやGETメソッドで`@Body`を使ったjsonリクエストはできないらしい
# 解決
いやいや、できる“`kotlin
@DELETE(“https://hogehoge/fugafuga”)
↓
@HTTP(method = “DELETE”, path = “https://hogehoge/fugafuga”, hasBody = true)
“``@Body`つけれた
Jetpack Compose で追加読み込みに対応した LazyColumn を実装する
Jetpack Compose で追加読み込みに対応した LazyColumn を実装しましたので、その方法をまとめます。
具体的には、一番下までスクロールしたときに追加読み込みを行う処理を呼び出すところまでの実装になります。# はじめに
まず、Jetpack Compose には[Lazy コンポーザブル](https://developer.android.com/jetpack/compose/lists?hl=ja#lazy)という Composable があり、RecyclerView と同様の役割を担います。
Lazy コンポーザブルには`LazyColumn`や`LazyRow`などがあります。本記事では`LazyColumn`を使用します。
# 実装したコード
以下に実装コードを示します。
“`kotlin
@Composable
fun AdditionalReadableItems(items: List, onAppearLastItem: (Int) -> Unit) {
val listState = rememberL
エッジコンピューティングを実現するCouchbase Mobile紹介:Sync Gatewayによるデータ同期におけるアクセス制御モデル
## はじめに
Couchbase Mobileは、エッジコンピューティングを実現するデータプラットフォームであり、Androidをはじめとしたスマートフォンや、エッジデバイス用の組込データベースである、Couchbase Liteと、Couchbase Server、そしてそれらの間のデータの同期を実現する、Sync Gatewayから構成されます。
Sync Gatewayによるデータの同期を理解するには、まず、アクセス制御モデルを理解することから始まるといってよいでしょう。
## アクセス制御モデル
### コンセプト
ドキュメントへのアクセスを制御するには、ドキュメントをチャネルにルーティングし、そのタイプのドキュメントにアクセスできるようにするユーザーまたはロールがそのチャネルにアクセスできるようにします。### モデル
Couchbase Mobileでは、ドキュメントへのアクセスは、ユーザー、ロール、チャネルという、3つのエンティティによって管理されます。#### アクセス制御モデル
![image.png](https://qiita-image-st
【React Native】FCMの設定でつまずいたこと(Androidのみ)
##1、FCM(Firebase Cloud Messaging)とは
Firebaseが提供しているアプリにプッシュ通知を送る機能です。
機能自体無料で使えて、アプリ側ではfirebaseから取得したfcmトークンをfcmに設定するだけでプッシュ通知を受け取れるためかなり便利です。
本格的なアプリを作るとなるとプッシュ通知は必要不可欠です。
https://firebase.google.com/docs/cloud-messaging?hl=ja##2、FCMの簡単な仕組み・設定方法
https://firebase.google.com/?hl=ja
↑Firebaseでプロジェクトを作成し、左のメニュー欄からCloud Messagingを選択します
開始方法からiOS、Android両方の設定をします。
iOSの方はAPNs認証キーの設定も必要なため、Apple Developerの登録も必要です。
今回はAndroidのみですのでそこは割愛します。
https://rnfirebase.io/messaging/usage
次にアプリ側でFCMトークンを取得し、その
【React Native】Androidでダークモードにするとアラートの文字が黒いままになってて見にくい
#Androidでダークモードにするとアラートの文字が黒いままで見にくい現象が起きた
Androidでアラートを出そうとした時、通常はこのようなUIになります。
![スクリーンショット 2021-10-13 14.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/72d37f65-05b7-883e-c6bf-951b45a33671.png)
実装はとても簡単でこんな感じです。“`javascript
import React from ‘react’;
import {Alert, Button, View} from ‘react-native’;export const AlertView = () => {
const onAlert = () => {
return Alert.alert(‘こんにちは’)
}
return (
【React Native】アプリ内でWebViewを表示する時のヘッダータイトルを動的に変更
##アプリ内でWebViewを表示する時、WebView内で画面遷移してもも動的にヘッダータイトルを変更したい
アプリを実装していく中で、ほぼ間違いなくStackNavigationを使って画面遷移の制御をすると思います。
アプリで表示するところは画面ごとにタイトルを決めれますが、webViewは一つタイトルを決めて、そこからwebView内で画面遷移しても同じタイトルが使われてしまいます。
webViewを使うときはタイトルを表示しないという選択肢もありますが、タイトルを動的に変更する方法を見つけたので共有します。##ライブラリをインストール
`react-native-webview`
`cd ios && pod install`##実装
WebViewの`onNavigationStateChange`というメソッドを使ってWebViewのタイトルタグを取得します。“`javascript
import React from ‘react’;
import {WebView} from ‘react-native-webview’;
import { SafeAr
[Kotlin]Android11での「他のアプリより上に重ねて表示」の権限許可対応
#「他のアプリより上に重ねて表示」の権限
Android11より前では「他のアプリより上に重ねて表示」の権限を許可するために「Settings.ACTION_MANAGE_OVERLAY_PERMISSION」のインテントアクションで、直接、そのアプリの「他のアプリより上に重ねて表示」の権限を許可する設定画面が開けていましたが、Android11からは、「他のアプリより上に重ねて表示」できるアプリ一覧画面にしか飛べなくなりました。つまり…、ユーザには、その画面からわざわざ該当アプリを探してもらって、「他のアプリより上に重ねて表示」の権限を許可する設定画面に遷移してもらわないといけなくなったんです。####`えっ、ちょっと待って、それじゃ、ユーザにリストからアプリを探して選択させて、許可をしてもらって、さらに2画面分前に戻らないと、元のアプリまで戻れないじゃん!Googleさん勘弁してくださいよぉ。`
って感じで、今まで1画面で完結してたんで、大したことはなかったのですが、これはちょっとユーザ負担が大きくなりますね…
#調査
ただ、「ユーザにリストからアプリを探して選択させて」
Jetpack Compose IntrinsicSize
AndroidのJetpack ComposeでIntrinsicSizeを用いてComposeを作成した時の知見です。
この記事は以下のバージョンに対応しています。– Jetpack Compose: 1.0.4
– AndroidStudio: ArcticFox 2020.3.1 Patch 3#IntrinsicSize
– 子要素Aは親の高さと同じ
– 子要素Bの高さによって親の高さが決まるこの条件を満たすComposeを作成する場合に、IntrinsicSizeを用いると実装できます。
例えば
![スクリーンショット 2021-10-29 9.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/78321471-53e8-d6e9-98cd-0cc1f9569bcf.png)
このようなComposeを作成する場合、左の縦線(子要素A)は親の高さと同じで、テキスト(子要素B)の高さによって親の高さが決まります。この場合、親のmodifierにModifie
THETAプラグインで手持ち/固定を判定する
## はじめに
リコーの @KA-2 です。弊社では[RICOH THETA](https://theta360.com/ja/)という全周囲360度撮れるカメラを出しています。
RICOH THETA VやRICOH THETA Z1は、OSにAndroidを採用しています。Androidアプリを作る感覚でTHETAをカスタマイズすることもでき、そのカスタマイズ機能を「プラグイン」と呼んでいます(詳細は本記事の末尾を参照)。今回は、THETAが手持ちされているか固定されているか、簡単に判断する方法を紹介します。
Android標準のライブラリをうまく使うことでも、かなり高精度な判定ができるのです。
(ある意味、厳密に判定しすぎかも?)◤Qiita記事公開◢
THETAプラグインで、カメラが手持ちされているか固定されているか簡単に判定する方法を紹介します!
先日公開Instant Night Snapで効果を
Android12のFCM対応問題
# 背景
Flutter1.xでアプリを開発しました。
運営でAndroid12を対応しないといけないため、色々苦労しました。
Firebase Clound Messaging(FCM)の対応は一番しんどいでした。
Android12ではServiceに対して、exportしないといけない
# export対応
[こちらのGoogle先生のドキュメント](https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja)によると
FCMのServiceはFirebaseMessagingServiceなので、`export=false`かと思います。
そして、この後はビルド成功し、特に問題なかった。
リリース審査出す直前、まさかの通知不通のテスト結果出て、exportの影響だなぁと思いきや、他の問題でした。
# 問題
前提:
FCMの20.0.0を使用しています。現象:
Android12のセキュリティ対応によって、こんなエラー出ていました。
“`
Targeting S+
Jetpack Composeのスクリーンショットを撮影する最小構成
## 概要
* Jetpack Composeのコンポーザブル関数のスクリーンショットを撮るという記事です
* とても簡単です :thumbsup:# プロジェクトを作る
Android Studio で新規プロジェクトを作ります。テンプレートは **Empty Compose Activity** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/330a33d4-7ff5-2fb2-2a83-d6881629cf50.png)
次に必要なライブラリを追加します。`androidx.compose.ui:ui-test-manifest`だけデフォルトで入っていないはずなので追記します。
“`gradle
dependencies {
testImplementation ‘junit:junit:4.13.2’
androidTestImplementation ‘androidx.test.ext:junit:1.1.3’