- 1. [Android]ViewBindingを使いたい!
- 2. react-native-webview で表示するページを Android の戻るボタンで戻れるようにする…のはわりと簡単だけど「戻れるかどうか」をちゃんと判定するのは結構難しいという話
- 3. [Android]Action BarとUINavigationの連携がうまくいかない
- 4. NavigationComponentのSafeArgsを使ってみる
- 5. RecyclerViewリファレンスの概説【翻訳】
- 6. 【Android】FCMでプッシュが来ないとき
- 7. this, baseContext, applicationContextの違い
- 8. [Android]Play Publisher Gradle Pluginでリリースした際に、Crashlyticsのログが難読化されたままになる場合の対処法
- 9. 【Android】TextView内の文中の装飾
- 10. Unityでkeystoreファイルを消してしまったら
- 11. 新しいAndroidランタイムパーミッションのAPIを使ってみる
- 12. adbからスクショを連続で撮ったときに、画像ファイル名に自動で通し番号をつける
- 13. Rxを使ってIllegalStateExceptionを回避する
- 14. 【Android】DataBindingを使ってログインする
- 15. ディスク容量が足りなくなった時
- 16. RxJavaで連続的なAPI呼び出し後のエラー処理方法
- 17. Android 10 搭載の一部端末で ListView の項目を選択できない障害について調べたら……
- 18. flutter_flavor + flutter_flavorizr を使って Flutter の Flavor を設定する
- 19. Google Play Developer ConsoleでのVALIDATE_APP_MESSAGE_MISSING_COUNTRY_PRICESについて
- 20. 【Android】ViewPager2でサイズが変わるカルーセル作成
[Android]ViewBindingを使いたい!
###ViewBindingを使いたい理由
xmlファイルでViewに指定したidを用いてアクティビティやフラグメントを書く際、findViewByIdを逐一書かなくて良きなのと、型安全なので記述ミスがなくなる。数か月くらい前に、話題になりましたが、まだ使えてない!時代のビックウェーブに乗り遅れた!という人向けに書いてみました。実装は、簡単です!
https://developer.android.com/topic/libraries/view-binding“`gradle
// モジュールの方ね!書けたらSync now!
android {
…
buildFeatures {
viewBinding true
}
}“`
適当に、Viewを配置して…
“`xml
react-native-webview で表示するページを Android の戻るボタンで戻れるようにする…のはわりと簡単だけど「戻れるかどうか」をちゃんと判定するのは結構難しいという話
## 概要
単純に「戻る」だけならシンプルに実装できますが、「これ以上戻れるかどうか」により処理を分けたい場合への対応について、 SPA 対応まで含めて説明している記事がなさそうだったのでまとめました。
「Android の戻るボタン」と書いていますが、 UI で「戻る」ボタンを表示しつつ、それ以上戻れないときは非アクティブにするといった対応にも応用できると思います。
## 1. 単純に戻す
WebView の ref を使って以下のようにすれば戻す操作はできます。
“`CustomWebView1.tsx
import {useFocusEffect} from ‘@react-navigation/native’;
import React, {useRef, useCallback} from ‘react’;
import {BackHandler} from ‘react-native’;
import WebView from ‘react-native-webview’;type Props = {
uri: string;
};export co
[Android]Action BarとUINavigationの連携がうまくいかない
#連携?
UpボタンがDestinationの遷移時に自動的に表示されたり、labelが自動的にタイトルに設定されたりすることです。#原因
初期化処理を
onCreate(savedInstanceState: Bundle?)
ではなく、
onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?)
で行っていたことが原因でした。ブレークポイントを設定してデバッグすればもっと早く見つかったかもしれません。
NavigationComponentのSafeArgsを使ってみる
#SafeArgsとは
画面間のデータの受け渡しをタイプセーフに行うためのものです。#対象者
既存のアプリにNavigationを使用しての画面遷移の導入は難しいけどタイプセーフに画面間でデータの受け渡しがしたい!##環境
MacBookPro Catalina
Android Studio ver.4.1.2
Kotlin ver.1.4.30#導入
project配下のbuild.gradleのdependenciesに以下を追加します。
“`gradle:build.gradle
def nav_version = “2.3.3”
classpath “androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version”
“`
続いてapp/build.gradleに以下を追加します。“`gradle:app/build.gradle#plugins
id ‘androidx.navigation.safeargs.kotlin’
“`“`gradle:app/build.
RecyclerViewリファレンスの概説【翻訳】
以下は↓のRecyclerViewについての文章を読みながらざっくり訳しました。
公式リファレンス:[Android Developers > Docs > Reference > RecyclerView](https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView)
## RecyclerView とは
限られた画面の中に大きいデータセットを表示するための、フレキシブルに使えるView。### 用語集
– Adapter: RecyclerView.Adapterのサブクラスで、データセットの中から表示すべきデータをViewに渡す。
– Position: Adapter内のアイテムの位置
– Index: 適用されている子Viewのインデックス。ViewGroup.getChildAt(int) で使用する。Positionとは対照的。
– Binding: Adapter内のPositionに対応するデータを子Viewに紐づけるプロセス。
– Recycle (v
【Android】FCMでプッシュが来ないとき
#1.Device Tokenが取得できているかチェック
tokenを取得する方法は2パターンあります。1.FirebaseMessagingServiceを継承したクラスでonNewTokenをオーバーライドする方法
“`kotlin:MyFirebaseMessagingService
override fun onNewToken(token: String) {
Log.i(“FIREBASE”, “[SERVICE] Token = $token”)
}
“`2.FirebaseMessaging.getInstance().token.addOnCompleteListenerを実装する方法
“`kotlin:MainActivity
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w(TAG, “Fetchin
this, baseContext, applicationContextの違い
### 初めに
Androidを勉強する過程で`Context`を使うようになりました。`Activity@this` `baseContext` `applicationContext`とContextと言ってもいくつかあるみたいなので、記事にまとめます!
### Contextとは
– AndroidにおいてContextというと大きく**ApplicationContext**と**ActivityContext**に分類できる
– ApplicationContextは常にアプリで一つであることが保証できる
– ActivityContextはActivityごとに管理しているContextでActivityが破棄(`onDestory`)されるとContextも破棄される
– ユースケースとして`Intent`の`packageContext`引数にはApplicationContextではなくActivityContextを使うべき
– Activity間の繋がりはContextによって作られる(多分)
– AcitivityはContextで
[Android]Play Publisher Gradle Pluginでリリースした際に、Crashlyticsのログが難読化されたままになる場合の対処法
Android アプリで [Crashlytics](https://firebase.google.com/docs/crashlytics?hl=ja) を使ってクラッシュログを確認していたのですが、ある時から Crashlyitcs のコンソールに表示されるログが難読化されたままになってしまいました。
原因を調査したところ、[Play Publisher Gradle Plugin](https://github.com/Triple-T/gradle-play-publisher) という Gradle Plugin が原因だったのでそれについて共有したいと思います。
## 問題点
Android アプリの開発において [Play Publisher Gradle Plugin](https://github.com/Triple-T/gradle-play-publisher) を使うと、Gradle のタスクで Google Play Console へ APK や App Bundle をアップロードできるようになります。
Issue にもあるのですが、どうやらバ
【Android】TextView内の文中の装飾
例として、`Hello Wolrd!`の`World`部分を装飾します。
# 文中の文字色・太さ・大きさ・下線・上付き文字・下付き文字
“`strings.xml
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
“`
出力結果:
Unityでkeystoreファイルを消してしまったら
# あらすじ
「`*.keystore`ファイルをうっかり失くして、こう対処した。」
「`*.keystore`ファイルはちゃんと管理しましょう。」というお話です。# 発端
UnityでBuildしたものをPlayStoreにアップロードすると、“`Android App Bundle が誤った鍵で署名されています。“`というメッセージが表示されました。何事だ??と確認すると、`*.keystore`ファイルが消えていました。
Plastic SCM でバージョン管理していたはずですが、`Check in`コマンドでステージングしたときに、アップロード内容に含め損ねていたようです。何と私が以前作成した`*.keystore`はもうこの世にありません!
失くしたものは仕方がないので方法を探しましょう。
# 鍵
PlayConsoleにアップロードするときには、アプリ本体、apkまたはaabと一緒に鍵がアップロードされます。この鍵は最初にアップロードされるときにPlayConsoleに登録され、以降のアップロードでは同じ鍵が必須です。
![image.png](htt
新しいAndroidランタイムパーミッションのAPIを使ってみる
Android 6.0で導入されたランタイムパーミッションですが、定型文が多い上に結果の受け取りが`onRequestPermissionsResult`のオーバーライドによる非同期処理となるため非常に使いづらく、ややこしくなりがちでした。昔記事を書いていたのがこちら。
https://qiita.com/niusounds/items/f8852534bd3135d89dccそんなランタイムパーミッションのAPIが、`androidx.activity 1.2.0`でより使いやすくシンプルなAPIになりました!
たとえば`startRecordButton`というボタンを押すと端末のマイクから音声入力を録音する処理`startRecording()`が実行されるアプリを作っているとしたら、以下のような感じのコードになります。
“`kotlin
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onC
adbからスクショを連続で撮ったときに、画像ファイル名に自動で通し番号をつける
adbからスクショを連続で撮ったときに、画像ファイル名に自動で通し番号をつけるコマンド。
“`sh
# 準備 最初に一回だけ実行
i=1# スクショ撮影 & 取得
adb shell screencap -p /sdcard/screen_$i.png && adb pull /sdcard/screen_$i.png && i=$(($i+1))
“`## 参考
adb 経由の screenshot の取り方
https://qiita.com/TNaruto/items/b2407f5668e15e42bedd
Rxを使ってIllegalStateExceptionを回避する
## はじめに
[こちらの記事](https://qiita.com/nein37/items/32613e9acd9558566c5e)を参考にさせていただきました。
Androidで非同期処理を実装していると、IllegalStateExceptionというExceptionが発生することがあります。
これは、onSaveInstanceStateより後のタイミングでFragmentTransactionをcommitしていることが原因で発生するものです。
例えば、APIを叩いてそのレスポンスを受けての処理やタイマーで時限式に動く処理など、アプリがバックグランドにある間に処理が走って、ダイアログを表示したり、次のFragmentに遷移したりするケースがこれに相当するかと思います。回避方針の詳細説明は他にも記事がたくさん出てくるのでそちらに譲りますが、簡単に言うと`onPause ~ onResumeの間`でFragmentTransactionをcommitしないようにすればこの問題を回避できます。
この記事ではRxを使って、`onPause以降`に走る処理を`onResume
【Android】DataBindingを使ってログインする
## はじめに
[DataBindingを使ってテキストを動的に変更する](https://qiita.com/kilalabu/items/3cded5e7c560de2ed05c)の応用版として
DataBindingを使ってログイン機能を実装してみた。(ログイン画面後のUIは適当なのでコード割愛)|ログイン成功時|ログイン失敗時|
| —- | —- |
|![login.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670405/45a624f8-c616-d3e7-04f2-5d1d33ccb4ed.gif)|![validation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670405/4a4fb2e5-7b48-4780-ad7b-bc0e098a580e.gif)|## 単方向と双方向バインディングの違いをおさえる
### `@{}` :単方向バインディングの特徴
* ViewMod
ディスク容量が足りなくなった時
Dockerを使って開発したりアプリ開発したりしているとギガがすぐに無くなるので自分用のメモ
## 調査&削除方法
### GUIから調査&削除
メニューバーの一番左のAppleのログを押して、
「このMacについて」>「ストレージ」>「管理…」と遷移して、
容量の大きいデータを調査し、適宜削除を実行する### Terminalから調査&削除
ディレクトリの各階層に移動して1GB以上容量を食っているディレクトリを列挙
“`bash
du -sh ./* | grep -E ‘[0-9]+\.?[0-9]+G’
“`だいたいいつも `~/Library` 以下に容量を食っているディレクトリがある(気がする)
### よくやるやつ
不要なDockerのデータを削除
“`bash
docker system prune
“`実行すると、以下のように削除される対象が表示されるので、問題がなければ「y」を押して削除実行
“`
WARNING! This will remove:
– all stopped containers
– all ne
RxJavaで連続的なAPI呼び出し後のエラー処理方法
RxJavaで連続的にAPIを呼び出して発生するエラーを処理するための方法です。
APIを繰り返し呼び出した場合にエラーが発生する場合、Exception処理を行うためonErrorResumeNextを利用できます。
この関数を利用すると、エラーが発生した時に他のObservableが流れ続けるようにできます。
エラーを返すためにonErrorで処理を分離することもできます。実例:
repo.getAuth(“xxx”)
.onErrorResumeNext { Single.error(AuthError(“${it.message}”)) }
.flatMap { repo.getPayment(it.token) }
Android 10 搭載の一部端末で ListView の項目を選択できない障害について調べたら……
# 障害発生
業務で Android アプリの保守をしていたら、Android 10 搭載の一部端末で ListView をタップしてもしばらく反応しないという障害が発生しました。障害が発生し始めたのは、TabActivity を(ようやく) ViewPager2 に置換してから。当該画面は Activity から Fragment に作り替えられました。
以前との違いを調べれば原因が分かるはず、とリーダーから指示されて調べたのですが……
# これは選択できなくて当然なのでは
調べて、原因が判明するまでに、Android Studio のデバッガで Android システムの Java クラス内部まで見る必要がありました。
原因はこうです。
Activity から Fragment に作り替えたことにより、ListView を含む Fragment が ViewPager2により Windows にアタッチしたりデタッチしたりされるようになりました。
ListView の親クラス AbsListView がWindow からデタッチされたときに呼び出される `onD
flutter_flavor + flutter_flavorizr を使って Flutter の Flavor を設定する
Flutter で環境ごとにビルド設定を切り替えるためには、Flavor を設定する必要があります。
[Creating flavors for Flutter – Flutter](https://flutter.dev/docs/deployment/flavors)
ですが調べてみると、Flavor を設定するためには各 OS ごとに手動でそれぞれ設定しなければならないため面倒です。
– [【Flutter】Flavor の設定~build まで(Android 編) – Qiita](https://qiita.com/hiromasa-fun/items/c79c99535f6f1db2a6a9)
– [Flutter で環境ごとにビルド設定を切り替える — iOS 編. モバイルアプリ開発において、環境ごとに設定を変えてビルド・配信することはほぼ必須… | by mono | Flutter ?? | Medium](https://medium.com/flutter-jp/flavor-b952f2d05b5d)もっと楽して Flavor を設定できないか
Google Play Developer ConsoleでのVALIDATE_APP_MESSAGE_MISSING_COUNTRY_PRICESについて
Androidアプリ(有料)のバージョンアップ時、リリースを作成しバイナリをアップロード後、リリースをレビューしたら
VALIDATE_APP_MESSAGE_MISSING_COUNTRY_PRICES
というエラーが発生しました。このエラーは、価格が設定されていない国/地域があると発生します。
解決するにはアプリの価格設定を更新します。商品→アプリの価格設定
を開き「価格を編集」をクリックして、未設定の国/地域欄を入力するか「為替レートを更新」を選べば完了です。
![スクリーンショット 2021-02-16 16.20.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629259/fffb0012-d57d-da03-30ae-541e1f27ff1f.png)
【Android】ViewPager2でサイズが変わるカルーセル作成
# dp定義
“`dimen.xml
10dp
50dp
60dp
“``offset`: 隣のアイテムを見せる長さ
`margin`: アイテム間の距離
`total_margin`: `offset`+`margin`# レイアウト作成
`ViewPager2`を配置するメインレイアウトの作成。“`activity_main.xml