- 1. CoordinatorLayoutについて
- 2. JUnitでのユニットテストに入門してみた
- 3. 【Android】ViewPager2を簡単に作ってみる
- 4. SearchViewのフォーカスの当て方、外し方
- 5. BottomSheetDialogFragmentでJetpack Composeを使う
- 6. [Android] flowWithLifecycleを使う際気をつけたいこと
- 7. API返却物の日付用Deserializer
- 8. Android 12でCaused by java.lang.IllegalStateException You need to use a Theme.AppCompat theme (or descendant) with this activity.
- 9. Android Studioでpush通知のアイコンを設定する
- 10. [Flutter]初心者でもできる無限スクロールの実装方法
- 11. [Android]忙しい人のためのアーキテクチャガイド~Domain Layer編~
- 12. [Android]忙しい人のためのアーキテクチャガイド~Data Layer編~
- 13. 【Android】ObjectAnimatorで遊ぼう
- 14. 【Android】独自のViewを描く
- 15. [Android] 古いバージョンのRoomを使用した時に出るビルドエラーを解消する(M1 Mac)
- 16. 【Android】テキストの長さに応じて高さ拡張+テキストスクロール
- 17. 【Android】バックグラウンド処理をServiceからWorkManagerに移行してみた
- 18. FlutterでFirebaseを使ってみる〜Firebase導入編(Android)〜
- 19. [Flutter] ビルド時のエラーの解決策 ( No matching client found for package name)
- 20. vdexファイルのデコンパイル
CoordinatorLayoutについて
#はじめに
##早速実装
パレットからAppBarLayoutをconstraintLayoutとかの場所にドラッグ
すると下の画像のようなポップアップが表示される。
Collapsing Toolbarにチェックを入れてOKを押下する。
現段階で実行したのがこちら。
![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704865/339e43e2-7ce9-4
JUnitでのユニットテストに入門してみた
# はじめに
初めまして、Androidエンジニアのバナナと申します。
Android開発の経験年数はそれなりになるのですが、テストコードを書くことなくここまできてしまったため、今年こそはという思いでテストについてまとめていければと思っています。
Androidテストのバイブルと言われている[Androidテスト全書](https://peaks.cc/books/android_testing)を参考に進めていきます
まずは、JUnitを使って簡単なユニットテストをしていきます。# テスト対象クラスの作成
今回は簡単な入力ボックスを想定し、8文字以上の英数字の入力であれば真を返すメソッドを持つクラスを作成していきます。“`kotlin:InputChecker.kt
class InputChecker {
fun isValid(text: String): Boolean {
if (TextUtils.isEmpty(text)) throw IllegalArgumentException(“Cannot be blank”)
【Android】ViewPager2を簡単に作ってみる
## はじめに
よくチュートリアル画面などの実装に使われるViewPager2。
早速実装してみようと思い色々調べていたのですが、プログラミング初心者ゆえに意外に混乱してしまったため簡単にまとめてみたいと思います。* 最近Android開発を始めた方
* ViewPager2について調べているけど記事によって書き方が違うので混乱してきた方などの参考になればとても嬉しいです。
もしも間違いなどあればご指摘いただけますと幸いです。## 実装内容
### 完成イメージ
こんな感じの横にスワイプするだけの画面を作ります。* ページは2ページ
* 無限スワイプはしない### 作成ファイル
* “` MainActivity.kt“` / “`activity_main.xml“`
SearchViewのフォーカスの当て方、外し方
#はじめに
SearchViewは少々クセの強いUIですが、検索窓の実装には比較的使用頻度の高いUIですよね。
画面遷移時にフォーカスを当てたり、外したりすることがたまにあったりしますが、いつも調べている気がしますので、まとめておこうと思います。#フォーカスの当て方
まず、フォーカスを当てるためには、以下を設定する必要があります。
“`
searchView.requestFocus()
searchView.requestFocusFromTouch()
“`上記を設定することでフォーカスを当てることができます。
ただし、キーボードは立ち上がりません。キーボードも合わせて立ち上げる必要がある場合は以下を設定する必要があります。
“`
searchView.setOnQueryTextFocusChangeListener { v, _ -> v?.showKeyboard() }
“`SearchViewはフォーカスが当たったのを待ってからキーボードを表示する処理を実行しないとキーボードが立ち上がらない、といった罠があります。
この点注意が必要です。
BottomSheetDialogFragmentでJetpack Composeを使う
既存プロジェクトの一部画面をJetpack Compose化していくなかで、BottomSheetDialogFragmentをJetpack Compose化しました。
その際にBottomSheetDialogFragmentのスクロールの処理と、Jetpack ComposeのLazyColumnのスクロールがいい感じに動作しなかったため大苦戦しました。なんとか解決できたのでご紹介します。ちなみにですが、ボトムシート自体をJetpack Compose化したのではなく、BottomSheetDialogFragmentのまま、レイアウトファイルをJetpack Composeリプレースした感じです。
この記事で実装したサンプルコートも公開しています。
https://github.com/yasukotelin/BottomSheetDialogFragmentWithJetpackCompose
## 普通に実装してみた
まず、普通にレイアウトファイルをJetpack Compose化してみます。ボタンが8つあるちょっと縦に長いボトムシートのイメージです。
Prev
[Android] flowWithLifecycleを使う際気をつけたいこと
# Lifecycle-awareなFlowの収集
ActivityやFragmentでFlowを収集する際、ライフサイクルに適した動作をする`Lifecycle.repeatOnLifecycle`の利用が[推奨されています](https://developer.android.com/kotlin/flow/stateflow-and-sharedflow?hl=ja#stateflow)。
通常の`LifecycleScope.launchWhen`ではアプリがバックグラウンドにある状態など、ビューが表示されていない場合でもイベントが処理されるためです。“`kotlin
class LatestNewsActivity : AppCompatActivity() {
private val latestNewsViewModel = // getViewModel()override fun onCreate(savedInstanceState: Bundle?) {
…
// Start a coroutine i
API返却物の日付用Deserializer
#最初に
今回は、APIの返却物でよくある日付を変換してくれるDeserializerを備忘録として残しておきます。###コード
“`kotlin:
@ExperimentalSerializationApi
@Serializer(forClass = ZonedDateTime::class)
object ZonedDateTimeSerializer : KSerializer{
private val formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIMEoverride fun deserialize(decoder: Decoder): ZonedDateTime =
ZonedDateTime.parse(decoder.decodeString(), formatter)override fun serialize(encoder: Encoder, value: ZonedDateTime) =
encoder.enc
Android 12でCaused by java.lang.IllegalStateException You need to use a Theme.AppCompat theme (or descendant) with this activity.
# 概要
AndroidX Core Splashscreenでスプラッシュ画面を作成するとAndroid 12端末で以下のようなクラッシュが発生することがあった。“`
Caused by java.lang.IllegalStateException You need to use a Theme.AppCompat theme (or descendant) with this activity.
“`不適切なタイミングで`installSplashScreen` を呼ぶと上記のエラーが発生することがある。
# 対策
件のクラッシュは `開発者向けオプション`で`アクティビティを保持しない`をONにしてアプリをバックグラウンドから起動すると高確率で発生する。
クラッシュの原因は `installSplashScreen` を `super.onCreate` の後に呼んでいたため。
“`MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.o
Android Studioでpush通知のアイコンを設定する
Firebase Cloud MessagingからAndroidへPush通知を送った際、アプリがバックグラウンドにある時はカスタムアイコンが表示されませんでした。後から考えてみれば文章をよく読んでなかっただけなのですが、性格上またやらかしそうなので忘備録としてまとめてみました。
##はじめに
push通知でカスタムアイコンを使用するためには、android studioにおいてアイコンを設定する必要があります。何も設定しないと、デフォルトの四角いアイコンが表示されます↓(これはこれでかわいい)。
カスタムアイコンの実装方法は、大まかに
①128×128pxの透過画像(png形式)を用意する
②android studioにおいてその画像を通知用のカスタムアイコンとして設定する
に分けられます。①については、~~面
[Flutter]初心者でもできる無限スクロールの実装方法
一覧表示画面で、スクロールすると次々にデータを読み込んでいく、無限スクロールを簡単に作る方法を紹介します。
無限スクロールを作る方法がいろいろあるのですが、初心者の自分でもできたのでこれが一番簡単かと思います。## データを取得するAPIを準備する
今回はAPI経由でデータを取得し、一覧表示するのでまずAPIを準備します。
今回は、以下のswaggerで記載したtitleのみが一覧で返されるAPIを用意しました。次のデータがあれば、レスポンスのoffsetに次の位置が返り、なければ返りません。“`yml:sample.yml
openapi: 3.0.0
info:
title: sample
version: ‘1.0’
description: sample
contact:
name: murapon
servers:
– url: ‘http://localhost:31180’
paths:
/list:
get:
operationId: get-list
summary: 一覧取得
de
[Android]忙しい人のためのアーキテクチャガイド~Domain Layer編~
#はじめに
この記事は、シリーズ作です。https://qiita.com/reo-androider/items/1ca168e290568a578cd6
https://qiita.com/reo-androider/items/18ec55f35c9a4fee66d3
https://qiita.com/reo-androider/items/8a0b7e9644631f44d19e
今回のDomain Layer編は、元々の分量が少ないです。
スクロール数は元と変わらないかもですが、文字数は 1 / 3 くらいにまで縮められたと思います。
#目次
– Domain Layerとは?
– Domain Layerのメリット
– 他の責務との関係
– 呼び出し
– ライフサイクル
– スレッド周り
– Domain Layerの使われ方##Domain Layerとは?
https://qiita.com/reo-androider/items/1ca168e290568a578cd6#domain-layer
##Domain Layerのメリット
Domain L
[Android]忙しい人のためのアーキテクチャガイド~Data Layer編~
#はじめに
この記事は、シリーズ作です。
今回は、概要編で少しだけ触れたData Layerについての項目を要約していきます。Data Layer編はかなり長いので、要約の意義が出てきますね。
分量を 1 / 3 くらいにすぼめています。https://qiita.com/reo-androider/items/1ca168e290568a578cd6
https://qiita.com/reo-androider/items/18ec55f35c9a4fee66d3
#目次
– Data Layerとは?
– データの公開
– ビジネスロジックの複雑化
– 信頼できる情報源
– スレッド
– インスタンスのライフサイクル
– 良いビジネルモデル
– いろいろなビジネルロジック
– エラーの公開
– 実例##Data Layerとは?
概要編にまとめてあります。https://qiita.com/reo-androider/items/1ca168e290568a578cd6
##データの公開
データやデータ操作の機能を公開する時は– suspend関数を用いる
【Android】ObjectAnimatorで遊ぼう
※当記事は表示している画像にラグがあります。お許しください。
ObjectAnimatorを使うとこんなことができました。
~~某シューティングゲー??~~
今回はObjectAnimatorの基本的なアニメーションをまとめます。
## ObjectAnimator
Viewをアニメートしてくれます。
アニメーション対象のViewをTargetと呼び、具体的にどうアニメーションするかを定義しているのがプロパティです。代表的なプロパティは以下
– ROTATION:回転
– TRANSLATION:移動
– SCALE:拡大縮小
– ALPHA:透過ほか、いわゆるセッターゲッターがある各属性(backGroudColorのような)なら、大体これでアニメーション化でき
【Android】独自のViewを描く
# Androidで独自のViewを描く
(当記事はJetPack Compose は使ってません)
円と半円を組み合わせて以下を作ります。## 手順
1. Viewを継承したカスタムクラスを作成
2. onDraw(canvas) をオーバーロード
3. canvasを組み合わせ、欲しいViewを描く ←メイン
4. ( Layoutファイルに1を配置 )### 1 Viewを継承したカスタムクラスを作成
“`kotlin.kt
class Onmyoudama @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(c
[Android] 古いバージョンのRoomを使用した時に出るビルドエラーを解消する(M1 Mac)
## はじめに
M1 MacでAndroid開発をする際、ライブラリのバージョンが古かったりすると問題が起こるケースがあります。
ここでは、その内のひとつの内容・解決方法をご紹介します。
私が問題に遭遇した時は日本語での情報が少なく、解決に苦労したということもあり、ここに残しておこうと思います。
## 開発環境
PC : M1 MacBook Air(2020) 16GB OS:Big Sur
AndroidStudio : ArcticFox arm64 (2020.3.1 patch3)Room 2.2.5
## なにが起きたか
Androidアプリ開発で使用される、ライブラリ`Room`のビルドが出来ない
#### ビルド時のエラーメッセージ
“`
Execution failed for task ‘:app:kaptDevelopmentDebugKotlin’.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
> ja
【Android】テキストの長さに応じて高さ拡張+テキストスクロール
# 概要
テキストの長さに応じてレイアウト変更するタイトル付きテキストのビューについて説明。
– テキストの長さが画面高さより短い場合、ビューの幅を変更。
– テキストの長さが画面高さより長い場合、テキスト部分をスクロール。タイトル部分はスクロールしない。| 短い | 長い(ビュー高さ拡張) | もっと長い(テキストのみスクロール) |
| —- | —- | —- |
| ![Screenshot_1643167486.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/9efe6448-29a0-6419-171d-496d76429baf.png) | ![Screenshot_1643167225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/8c2e6422-1eca-b5fc-e17b-75a56ef31ddb.png) | ![Screensh
【Android】バックグラウンド処理をServiceからWorkManagerに移行してみた
# はじめに
皆さん、ごきげんよう!れぶです!
今回の記事は、バックグラウンド処理の実装についてです。Android 8.0(Oreo)以降、バックグラウンド処理に対する厳しめな制限が導入されました。その結果、Service(特にバックグラウンドサービス)を使った実装をすると、動作が安定しません。詳しくは、[こちら](https://developer.android.com/about/versions/oreo/background?hl=ja#services)を参考にしてみてください。
なので、バックグラウンド処理を行う際には、Android Jetpack系の[WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager?hl=ja)を使うことをGoogleは推奨しています。このWorkManagerは、電池寿命の向上・互換性の高さ・様々な条件や制約を付与できるなど、メリットが沢山あります。API level 14から機能します。
そのような背景から、今回は`S
FlutterでFirebaseを使ってみる〜Firebase導入編(Android)〜
## 投稿の経緯
FlutterのキャッチアップでFirebaseと連携してFirestoreを使うサンプルプロジェクトを立ち上げました。今回はAndroidアプリにFirebaseを導入してエミュレーターでビルドするところまでを書こうと思います。iOSアプリにFirebaseを導入する記事は↓コチラ↓
https://qiita.com/nkekisasa222/items/ebca2a89319fd0dcfe72
## 環境
Flutter:2.8.1
MacOS:12.1## サンプルプロジェクト
GitHubにコードPushしています。気になる方はご覧ください。
![QR_925113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/f774b418-6fc2-a814-c742-ebf8dde02847.png)## Firebaseの導入
公式情報を参考にして進めていきます。https://firebase.google.com/docs/flutter/se
[Flutter] ビルド時のエラーの解決策 ( No matching client found for package name)
flutterで、androidのビルド時に下記エラーがでて、詰まったので共有です。
## エラー文
“`terminal
Execution failed for task ‘:app:processDebugGoogleServices’.
> No matching client found for package name ‘com.xx.xx’
“`## 解決策
google-services.jsonのpackage_nameとbuild.gradleのapplicationIdの2つを一致させる必要がありました。“` android/app/google-services.json
“client”: [
{
“client_info”: {
“mobilesdk_app_id”: “xxxxxxxxxxx”,
“android_client_info”: {
“package_name”: “com.xx.xx” //ここ
}
},
“`“
vdexファイルのデコンパイル
カスタムアンドロイドにてよくわからないAPIを調べるとき用。
要するに以下に無い場合は端末内にあるはず。という前提で
https://cs.android.com/あらかじめstringsとgrepで当たりをつけておくと楽
# 流れ
vdex -> cdex -> dex -> jar(classファイル) -> jar(javaファイル) -> jar解凍# vdex -> cdex
vdexExtractorを使う。
https://github.com/anestisb/vdexExtractorREADMEにはdependencyとかdisassembleとか書いてあるけど
とりあえずiとoを指定してやればcdexファイルが出来る
ヘルプに出てくる=(イコール)は不要# cdex -> dex
cdexはcompact dexとか言うらしい。
https://github.com/anestisb/vdexExtractor/issues/23
の compact_dex_converter_linux.zip を落として解凍すればそのまま使える。
wind