Android関連のことを調べてみた2022年01月24日

Android関連のことを調べてみた2022年01月24日
目次

Androidアプリ開発におけるローカルデータベース〜Room覚書

## はじめに

1年以上前(2021年1月)に下記の記事を書きました。

https://qiita.com/yoshiyuki_kono/items/05496b26e1dc4eb99ddb

Realm、Couchbase Liteからはじめ、色々とマイナーなものを取り上げたものの、影響力に鑑みて、Android Roomを無視するわけには〜OSレベルの汎用性は別として〜いかないと考え、調査を始めた記録を覚書として残します。

上記記事を執筆したモチベーションは、業界の技術動向を理解した上で、Couchbase Lite/Mobileを、その中に位置付けることでした。Couchbase Mobileについては、以下参照ください。

https://qiita.com/yoshiyuki_kono/items/6a5bbad1b02196a25417

https://techbookfest.org/product/5074954942939136?productVariantID=5042865933647872

Couchbase Mobileは、NoSQL組み込みデータベ

元記事を表示

notifyDataSetChanged() に警告が出るようになったので ListAdapter に置き換える

# 背景
いつからかは正確にはわからないですが、 `RecyclerView.Adapter.notifyDataSetChanged()` をコールしている箇所に
Android Studio で警告が表示されるようになりました。

## 警告の内容

“`kotlin
adapter?.notifyDataSetChanged()
“`

> It will always be more efficient to use more specific change events if you can.
> Rely on notifyDataSetChanged as a last resort.

データに変更があった場合はより軽量な処理(例: notifyItemChanged )を使ってくださいということです。

## Workaround
以下のように `notifyItemRangeRemoved` を使って修正すれば警告は回避できます。

“`kotlin
val preCount = adapter?.itemCount ?: 0
// ここに全消し処理が入る
a

元記事を表示

【Flutter】Shimmerを利用してUXの高いローディング処理を実現

インドネシアの[PT.AQ Business Consulting Indonesia](https://aqi.co.id/)でFlutterのエンジニア兼アドバイザーをしております菊池と申します。

Zennで本を出版しております[flutter chips](https://zenn.dev/tetsukick/books/06ee607e30e243)(30,000字程度)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/5183aafc-d1d7-534f-f618-031f10790fdc.png)

## Shimmerとは
データの読み込み中であることをユーザーに伝える方法の一つとして、読み込み中のコンテンツの形状に近似したUIの上に、グレー等の色でローディング状態を表現するアニメーションです。

以下、[Flutter公式](https://docs.flutter.dev/cookbook/effects/shimmer-loading)から参照。
![]

元記事を表示

[Android]忙しい人のためのアーキテクチャガイド~UI Layer編~

#はじめに

https://qiita.com/reo-androider/items/1ca168e290568a578cd6

こちらの続きです。
前回は、UI Layerを責務の分離において「表示」を担当すると簡略化して表現しましたが、今回はそれに関して詳しく見ていきます。

###対象
– 忙しくてアーキテクチャガイドを読んでいる暇などない人
– Androidにおいて、推奨されるアーキテクチャを知りたい方
– アーキテクチャガイドを読んだけども、何を言っているのか分からなかった人

#目次
内容は次の4つです。

###・UI状態の定義
###・データフローについて
###・データの監視
###・データの更新

#UIレイヤーでやること(手順)
ここでは、ニュース記事をAPIから取得するアプリを例に出しています。

##UI状態の定義
UIが保持するデータやロジック+UIコンポーネントでUIが構成されていることを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/

元記事を表示

MotionLayoutの例を試してみる

MotionLayoutを触ったことがないので、今後のために試しておこうと思います。

# 公式リファレンス
https://developer.android.com/training/constraint-layout/motionlayout/examples?hl=ja

https://developer.android.com/training/constraint-layout/motionlayout/ref?hl=ja

今回は基本的なモーションを試していきます。

#基本的なモーション

公式では横の動きをしているので縦の動きをしてみようと思います。

gifなので動きカクカクに見えますが。。。完成はこんな感じです。
![基本的なアニメーション.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/bc6ef09e-e3ed-eeec-468b-3164127524c8.gif)

まずはMotionLayoutをActivityのレイアウトに設定します。

“`acti

元記事を表示

ActivityからFragmentへの遷移

#初めに
MainActivityクラス、Fragmentクラス、activity_main.xml、fragment_layout.xml を用意します

#実際にコードで書いていきます
Activity から Fragment への遷移を
MainActivityの onCreate内に コードで書いていきます

“`
val fragment = Fragment()
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.add(R.id.container, Fragment)
fragmentTransaction.commit()
“`

上から1行ずつ説明していきます

1行目 

“`val fragment = Fragment()“`

変数fragment の 宣言をします
その変数fragment は 作っておいた Fragment になります

2行目  
“`val fragmentTransaction = sup

元記事を表示

Guide to app architectureからプラクティスを拾うメモ ドメインレイヤー編

https://qiita.com/takahirom/items/e54f162f188d7de9c1d0

の続きです。

https://developer.android.com/jetpack/guide/domain-layer?hl=en

## 用語整理

(通常想像するドメインだと例えばニュースアプリではArticleクラスとかが入っているやつを想像すると思うんですが、ここではUseCaseが入っているっぽいです)

ドメインレイヤーとは?

> The domain layer is an optional layer that sits between the UI layer and the data layer.

UIとデータレイヤーの間にある任意のレイヤー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/a23309f4-4aef-747f-898a-20ad519d0e72.png)
https://developer.android.com

元記事を表示

React Native Expo利用時にAndroidエミュレータでエラーになるときの対処法

React NativeのExpoでAndroidエミュレータを開いたときエラーが出たため、その解決方法を備忘録として残しておきます。

## 環境
MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) OS Monterey12.1
expo –version:5.0.3
端末:Pixel_2_API_30:

# エラーが起こったエミュレータ起動手順
①ターミナルで以下のコマンドでExpoの管理画面をブラウザ表示

“`
expo start
“`

②サイドメニューのRun on Android /device/emulatorからエミュレータを起動する

![スクリーンショット 2022-01-23 17.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360790/6e3008cd-60aa-9d01-fec9-03aa788dd019.png)

# エラー内容

上記の方法でExpoでアプリを開くと以下のエラーになってし

元記事を表示

Guide to app architectureからプラクティスを拾うメモ UIイベント編

https://qiita.com/takahirom/items/99cfa342a00ba9a99ef8

の続きです

https://developer.android.com/jetpack/guide/ui-layer/events?hl=en

# 用語整理

UIイベントとはなにか?

> Key terms:
UI: View-based or Compose code that handles the user interface.
UI events: Actions that should be handled in the UI layer.
User events: Events that the user produces when interacting with the app.

UI: ViewかComposeかのコードでユーザーインターフェースを扱う。(例: MoviesFragment)
UIイベント: UIレイヤーでハンドルするべきイベント。(例: Snackbarの表示)
Userイベント: アプリに触れたときにユーザーが発行するイベント。

元記事を表示

【kotlin】超簡単なMVPを実装してみた、④異なるレイアウト(Fragment)との連携

# はじめに
今回はMVP(アーキテクチャ)に沿って、異なるレイアウト(Fragment)との連携を実装していきたいと思います。

# 実装内容
・Activity(親View)の下半分にFragment(子View)を重ねる。
・ACTIVITYボタン(紫文字)が押された際に双方ViewのTextViewに1を足し、表示する。
・FRAGEMENTボタン(赤文字)が押された際に双方ViewのTextViewに10を足し、表示する。
![Screenshot_1642842015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784089/de1e3daa-05f7-395f-8ffc-b3be880af641.png)

# 実装
**[レイアウト]**
Activity(親)側
①activityButton
②activityTextView
Fragment(子)側
③fragmentButton
④fragmentTextView
![Screenshot_1642842015.png](ht

元記事を表示

新しいくモジュールを作ったときにのbuild.gradleを3行で済まし、カスタマイズをDSLで行う

これはGradleのプロジェクト全般で利用できると思います。

AndroidやKotlin Multiplatformの開発でたくさんモジュール作って開発していると、毎回build.gradleをレビューしたりとか大変ですよね?

例えばAndroidだと以下のような長い定型文を書く必要があります。

“`kotlin
plugins {
id(“com.android.library”)
id(“org.jetbrains.kotlin.android”)
}

android {
compileSdk = 32

defaultConfig {
minSdk = 21
targetSdk = 32

testInstrumentationRunner = “androidx.test.runner.AndroidJUnitRunner”
consumerProguardFiles(“consumer-rules.pro”)
}

// ながい。。
“`

build.

元記事を表示

プライバシーポリシー

本アプリを通じて第三者に個人を特定できる情報を提供することはありません。
本アプリが個人情報を収集・利用することはありません。
ご不明な点があれば msonrm@gmail.com までお問い合わせください。

元記事を表示

[Android]忙しい人のためのアーキテクチャガイドの要約~概要編~

#はじめに
###対象者
– 改定されたものの、忙しくてアーキテクチャガイドを熟読している暇などない人
– 読んでみたけども、何を言っているのか全く分からなかった人
– アーキテクチャがなぜ必要なのか分からない人
– 設計の原理原則を知りたい人

#目次
内容は、主に4つです。

###1. 設計の必要性
###2. Googleが推奨している設計パターン
###3. ベストプラクティス集

#1.設計の必要性
###UXの注意点
Androidアプリケーションは、ユーザーとAndroidOSの事を考えて開発する必要があります。

– ユーザーは、デバイス上のアプリを短時間の中で多くの操作を行うことがある。

– モバイルのリソースは限られているため、AndriodOSの最適化処理によっていつでも強制終了する可能性がある。

これを想定した時に回避すべきなのは

– コンポーネントがデータを持っていること
– コンポーネント同士が依存関係にあること

##原理原則について
そのために、大事なことは「責務の分離」。

####関心の分離

例えば、Activity/FragmentはUI

元記事を表示

【Android】StateFlow で EventBus を実現する

## 1. はじめに

今回は Android で簡易的な EventBus の実装方法として、StateFlow を使ったイベント通知実装を紹介したいと思います。

背景としては、私の担当するプロジェクトでアプリケーションの Foregroud、Backgroud を検知で実現する機能を実装する上で今回の実装が必要になったことにあります。Android の EventBus としては [EventBus](https://github.com/greenrobot/EventBus) などのライブラリを利用する方法もあるのですが、ライブラリ導入はその後のメンテナンスコストや脆弱性が生じる可能性も考慮する必要があります。また、ライブラリの導入は、今回実現したかった機能に対してオーバースペックだったため、チームとして独自実装で実現することにしました。

## 2. まず考えたこと

まず最初に大まかな実現方法をイメージしてみました。

1. Application Class で Foreground, Background を監視する
1. Singleton で状態管理するクラスを作

元記事を表示

【Android】Some kotlin libraries attached to this project were compiled with a newer Kotlin compiler and can’t be read. Please update kotlin plugin. が出る(自分用メモ)

## エラーとの出会い
これから新しいアプリを作ろうと思い、build.gradleの依存関係をある程度整え、Activityファイルの実装に移ろうとしたところで妙な警告が画面上部に出ているのを発見しました。

![IMG_8701 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1274260/3b37a478-1bfa-ccef-0a47-008f88af20e5.jpeg)

“`Some kotlin libraries attached to this project were compiled with a newer Kotlin compiler and can’t be read. Please update kotlin plugin.  No updates found.“`

kotlinライブラリが読み込めないのでkotlinプラグインをアップデートしてくださいとのこと。なのにその隣にはNo updates found.とか書いてあります。アップデートしてくださいと言わ

元記事を表示

Jetpack Compose Navigation(Navigation Arguments, Nested Navigation)

#目次

1. Navigation Arguments, Nested Navigationとは
2. サンプルコード
3. まとめ

##1. Navigation Arguments, Nested Navigationとは

“Navigation Arguments“‥画面遷移時に、画面間で共有できる値。この値は、**{ } (プレースホルダ)**を用い、**arguments**を**型を指定してlist**で管理できます。また、SavedStateHandleを使って、画面遷移時に必要なargumentsを取得できますが、今回は説明を省きます。

**以下の実装を行います(UIの詳細については説明を省きます。)**

![navigation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512202/c71d4ece-6d36-fa0b-f634-51d726af14d8.gif)

“Nested Navigation“‥デスティネーションを、モジュール化すること。**Na

元記事を表示

Android プロジェクトの未使用リソースをコマンドラインや CI で削除する (Remove Unused Resources Plugin)

Android プロジェクトの未使用リソースを一括で削除する Gradle Plugin を公開しました。このプラグインのメリットや使い方を解説します。

# Remove Unused Resources Plugin for Android

Remove Unused Resources Plugin により、Gradle Task から Android の未使用リソースを削除できるようになります。

https://github.com/irgaly/android-remove-unused-resources-plugin

## 特徴やメリット

* Android Lint `UnusedResources` ルールの実行結果 `lint-results.xml` をもとにリソースの削除を実行します
* 未使用リソースの検出は Android Lint に任せているため、Android Studio の `Refactor > Remove Unused Resources…` メニューと同じ結果を期待できます

![Android Studio の Re

元記事を表示

【Android】ResultAPI を使って実行時権限をリクエストしてみる

AndroidX に追加された ResultAPI を使って実行時権限をリクエストする処理を書き方をご紹介したいと思います。

## ResultAPI とは
ResultAPI とは、androidx.activity のバージョン 1.2.0-alpha02 と androidx.fragment のバージョン 1.3.0-alpha02 で追加された API です。

これを使うことで非推奨となった “`onActivityResult“` や “`onPermissionRequest“` などの処理を置き換えるとともに簡潔に書き直すことができるようになります。

今回は “`onPermissionRequest“` が実現できる実行時権限をリクエストしてその結果を受け取る処理を ResultAPI を使って書いていきたいと思います。

## 環境
Android Studio:2020.3.1 Patch 4
kotlin:1.5.31
targetSdkVersion:31
minSdkVersion:27

## 準備
まずは gradle にライブラリを追

元記事を表示

Android StudioのGitウインドウにLocal Changesタブを表示させる方法

# 手順
Preferences > Version Control > Commit
Use non-modal commit interface のチェックを外す

元記事を表示

Google Play のデータセーフティセクションのあれこれ

2022年4月までにGoogle Playに公開されている全てのアプリに対応が求められている「データ セーフティ フォームの回答」を頑張るためのあれこれをまとめておきます。

# はじめに

備忘録なので期待しないで。

当初は「データセーフティフォーム」と呼ばれていたけどいつの間にか「データセーフティセクション」になっていてよくよく見ると「データ セーフティ セクション」が正式な表記だったりした。

# 収集(collect)と共有(share)

一般的な「収集」と「共有」とは違う用語なので注意。

[Google Play のデータ セーフティ セクションの情報を提供する \- Play Console ヘルプ](https://support.google.com/googleplay/android-developer/answer/10787469?hl=ja) より抜粋。

– **「収集」**とは、ユーザーのデバイス外にアプリからデータを送信することを意味します。
– **デバイス上でのアクセス / 処理**: アプリがアクセスするが、ユーザーのデバイス上でロ

元記事を表示

OTHERカテゴリの最新記事