- 1. Jetpack ComposeのButton達を比較してみよう
- 2. SerializableのserialVersionUIDが原因で発生するInvalidClassExceptionの対処方法
- 3. 【Kotlin研修15日目】リサイクラービューの実装
- 4. 対策例:startActivityForResult(Intent,int) in Fragment has been deprecated
- 5. unityで作成したアプリとfirebaseを接続し、Android実機でテストする方法
- 6. 画面遷移のアニメーション再生時間を利用したAndroidのアプリ制限の突破
- 7. Android端末に直接apkとobbをインストールする方法
- 8. Jetpack ComposeでInstagram Home作った
- 9. Booleanとオブジェクトのリストを持つデータクラスのParcelableを実装する
- 10. ファーウェイ端末であるかどうか判断する方法
- 11. Androidアプリにおける フラグメントトランザクション
- 12. 【Kotlin研修14日目】CoordinatorLayoutを利用したスクロールと連動するツールバー・FABの実装
- 13. 【Kotlin研修14日目】マテリアルデザインとテーマファイルの定義
- 14. Android個人開発者におすすめするアプリコンテスト(賞金総額はUS$1,000,000)
- 15. EMUIバージョンの取得方法
- 16. 【Kotlin研修13日目】暗黙的インテントを利用したカメラ機能の実装
- 17. DaggerのAssisted Injectを楽にするクラスと拡張関数を作った
- 18. iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(3/3 ライブラリ使い方編)
- 19. iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(2/3 実装方針編)
- 20. 双方向性マップ
Jetpack ComposeのButton達を比較してみよう
みなさん`Jetpack Compose`使ってますでしょうか 導入しているrepositoryも多くなってきましたね
Composeで遊んでいる中で、Buttonとつくcomponentが多くどれを使うか迷うこともあったのでまとめることにします
xmlでButtonを使っていて軽くcomposeを触り始めたくらいの人に参考になれば嬉しいです# 環境
“`
kotlin: 1.5.10
compose: 1.0.0-beta09
“`:warning: 投稿時点では`1.0.0-beta09`のため参考にする時点では変更が入っている恐れがあります:warning:
# Buttons
## Button
### Arguments
ごく普通のボタンです 最初からMaterial仕様なのがいいですね
argumentか
SerializableのserialVersionUIDが原因で発生するInvalidClassExceptionの対処方法
# serialVersionUIDとは
serialVersionUIDはSerializableなオブジェクトに定義するバージョン番号のようなものです。データのシリアライズ/デシリアライズする際に、互換性を確認するためにこのserialVersionUIDを使用します。
また、serialVersionUIDを定義しない場合、自動で計算されることになります。
## `InvalidClassException`
これは、Serializableなオブジェクトをデシリアライズする際、serialVersionUIDが異なる場合に発生します。
“`
java.io.InvalidClassException
com.sample.data.SampleSerializableData;
Incompatible class (SUID):
com.sample.data.SampleSerializableData:
static final long serialVersionUID =4092797215335171425L;
but expect
【Kotlin研修15日目】リサイクラービューの実装
# リサイクラービュー(RecyclerView)
[参考1: RecyclerViewでのリスト作成](https://developer.android.com/guide/topics/ui/layout/recyclerview)
[参考2: 研修14日目(CoordinatorLayout)](https://qiita.com/b150005/items/fc85877a55efa1613e3d#coordinatorlayout)
`CoordinatorLayout`で**スクロール連動**させるために必要な`NestedScrollingChild`インタフェースを実装した`ListView`。`リサイクラービュー`が保持する`レイアウトマネージャ`を通じて`リスト`の`レイアウト`を決定し、
`アダプタクラス`によって生成される`ビューホルダ`を通じて、`アイテム内ビュー`に`リストデータ`が埋め込まれる。![リサイクラービュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0
対策例:startActivityForResult(Intent,int) in Fragment has been deprecated
# 背景
startActivityForResult(Intent,int) での画像選択コードが deprecated と言われるので、修正前後のコード例を残しておく。# コード
## 修正前
“`java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private final static int RESULT_PICK_IMAGEFILE = 1000;@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
super.onActivityResult(requestCode, resultCode, resultData);if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == RESULT
unityで作成したアプリとfirebaseを接続し、Android実機でテストする方法
# unityで作成したアプリとfirebaseを接続する
Firebase公式のドキュメント[Unity プロジェクトに Firebase を追加する](https://firebase.google.com/docs/unity/setup)があるにあるのですが、いまいちわかりにくいので、健忘録がてらまとめました。##Androidのbuild環境を設定し、プレイヤーセッティングへ
[![Image from Gyazo](https://i.gyazo.com/03571c86918b70734e350722aaeae3f8.png)](https://gyazo.com/03571c86918b70734e350722aaeae3f8)##カンパニーネームとプロダクトネームをユニークなものに設定する
[![Image from Gyazo](https://i.gyazo.com/0dbe2043c2cfd5cc34413aee3506cdb3.png)](https://gyazo.com/0dbe2043c2cfd5cc34413aee3506cdb3)##P
画面遷移のアニメーション再生時間を利用したAndroidのアプリ制限の突破
Androidが別のアプリに遷移するときのアニメーション再生時の制限との僅かなラグをを利用した安心フィルター等のアプリ制限の突破の方法です。
# はじめに
この記事はアプリ制限を突破することを目的としているわけではなく、Androidベースのosやフィルターアプリ等の開発者の方に突破の手段があることを伝えることが目的です。
またこれを書いている人は特に専門的な技術、知識を持っていない高校生です。調べたら誰でもできることだと思います。故に間違い、タブー等を犯していることもあると思います。大目に見てください。## 環境
今回成功した環境です。
### スマホ側
– OPPO Reno3 A
– Android 11 ベースのos ColorOS V11
– モデル CPH2013 (←?)
– あんしんフィルター for UQ mobile### PC側
– Windows 10 Home
– Android Debug Bridge version 1.0.41おそらく必要ない情報も含まれています。念の為です。
# 大まかな方法
1. アニメーション時のラグを利用し設定から
Android端末に直接apkとobbをインストールする方法
今回は書き出したapkとobbをインストールする方法を記載いたします。
adbコマンドのPathを通す
===
公式サイトにアクセスして`SDK Platform-Tools`をダウンロードし
Zipファイル解凍し、個人のPathを保存している場所に移動しましょう。
(C:直下でも大丈夫です。)[SDK Platform-Tools](https://developer.android.com/studio/releases/platform-tools)
解凍が完了したらシステム環境変数に解凍したフォルダを追加しておきます。
コマンドプロンプトなどでadbとコマンドを入力し、
adbコマンドの説明が出れば成功です。apkとobbをインストールする
===
Androidは開発者向けオプションでUSBデバッグを有効にしておき、PCとAndroidをUSB接続しましょう。その後コマンドプロンプトでapkとobbを置いてあるフィルダに移動し、下記のコマンドを入力しましょう。
“`
adb install {パッケージ名}.apk
“`続いてobbがある場合
Jetpack ComposeでInstagram Home作った
# つくったもの
![device-2021-06-16-232127.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185927/72f07b7b-7891-cd5f-4f0d-b0a0e8c0dc66.gif)# 実装内容
## 画面全体
画面自体はScreenという単位で`Scaffold`で囲って作っています。その`Scaffold`に`topBar`を設定していることで上の`TopAppBar`が表示されています。
`TopAppBar`には`navigationIcon`と`title`用のComposableを設定できて、これらを設定していることで戻るボタンやタイトルのテキストが表示されています。“`kotlin
Scaffold(
topBar = {
val title = stringResource(id = R.string.home_instagram_home_section_title)
To
Booleanとオブジェクトのリストを持つデータクラスのParcelableを実装する
## Parcelableとは?
– 状態を一時的に保存して欲しいオブジェクトが実装すべきインターフェイス
– `Parcelable`を実装したオブジェクトは、`Intent`を使って`Activity`間でやり取り出来る## Parcelableの実装
`Note`というデータクラスを使って`Parcelable`を実装してみます。
“`kotlin
data class Note(
val id: Int,
val title: String,
val createdAt: Date,
val isDeleted: Boolean,
val pages: List
) : Parcelable {override fun describeContents(): Int = 0
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.run {
writeInt(id)
ファーウェイ端末であるかどうか判断する方法
ファーウェイ端末であるかどうか判断するソースコードは次の通りです。
“`java
public class HuaweiUtil {public static String getManufacturer() {
try {
Class> classType = Class.forName(“android.os.SystemProperties”);
Method getMethod = classType.getDeclaredMethod(“get”, new Class>[]{String.class});
return (String) getMethod.invoke(classType, new Object[] {“ro.product.manufacturer”});
} catch (InvocationTargetException e) {
e.printStackTrace();
} catc
Androidアプリにおける フラグメントトランザクション
#フラグメントトランザクション
用語から解説していきます。
>**フラグメント**とは、簡単にいうと、コンテンツとライフサイクルを持ったビューです。
>**トランザクション**とは、複数の処理を1セットとする考え方です。よくある例が、口座の振り込み処理。「Aが払う、Bがもらう」で1セットの考え方。フラグメントの追加、削除では、データベースへのデータの追加、削除と似た“フラグメントトランザクション“という考え方をします。
同一アクティビティ上に、フラグメントが存在し得る時などに必要となってきます。
例えば、左半分にリストデータがあり、右半分にリストデータをタップした時に表示されるフラグメントがある時などです。#使い方手順
1,FragmentTransactionオブジェクトを取得
2,対象Fragmentオブジェクトを生成、もしくは取得する。
3,フラグメントの追加/削除/置き換え処理を行う
4,コミットする##1,FragmentTransactionオブジェクトを取得
“FragmentTransaction“とは、一連のフラグメント操作を実行するた
【Kotlin研修14日目】CoordinatorLayoutを利用したスクロールと連動するツールバー・FABの実装
# アクションバーとツールバー
[参考: 研修4日目(アクションバー)](https://qiita.com/b150005/items/1f58b3418bb1690c2f4b#%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%90%E3%83%BC)## アクションバー
`アクティビティ`のタイトルや`アクション`を視覚的に表現する、**アプリ上部**に表示されるバー。![アクションバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673880/377648aa-dd0b-f85e-ef5e-22790fd2f460.png)
## ツールバー
`アクティビティ`のタイトルや`アクション`を視覚的に表現するバー。
`レイアウトファイル`(=`activity_main.xml`)に記述して`ビュー`として定義できるため、`アクションバー`に比べて柔軟性に富む。![ツールバー.png](https://qiita-image-s
【Kotlin研修14日目】マテリアルデザインとテーマファイルの定義
# マテリアルデザインとテーマファイル
[参考: Introduction](https://material.io/design/introduction)
`マテリアルデザイン`とは、`Google`が発表した`UI設計`に関するガイドラインであり、以下の**3原則**を遵守する。* 物質とは象徴である
> 画面は`2次元`であるが、`UI部品`を物質として扱うことで`3次元`的に配置する。
* 大胆で、生動的で、計画的である
> `印刷デザイン手法`に基づき、タイポグラフィや配置、色を工夫することで、`ユーザ`に没入体験を持たせる。
* 動きには意図がある
> `UI部品`の役割に応じた動きをつけることで、`ユーザ`に継続的に集中させる。
`Android OS`も`Google`が開発したOSであるため、標準で`マテリアルデザイン`に基づいて設計されている。
`文字スタイル`や`配色`を定義する`テーマファイル`(=`themes.xml`)においても、
`マテリアルデザイン`に準拠したものになるよう、注意する必要がある。## マテリアルテーマ
`マテリア
Android個人開発者におすすめするアプリコンテスト(賞金総額はUS$1,000,000)
# [Apps UP 2021](https://developer.huawei.com/consumer/en/activity/digixActivity/digixdetail/101618451100197545) の概要
https://developer.huawei.com/consumer/en/activity/digixActivity/digixdetail/101618451100197545
## 背景
ファーウェイは世界各地のエンジニアと共にデジタルトランスフォーメーションを推進し、HMS キットを用いて、世界の消費者に次世代のIoT 体験を提供します。– 合計賞金が100万ドル
– HMS開発者が400万人以上
– HMSアプリ数が134,000以上
– 国と地域が170個以上![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/1b18e7a6-17dd-5278-7f9e-b69d7e5a98f6.png)
## 地区
大会はアジア
EMUIバージョンの取得方法
EMUIはファーウェイがAndroidをベースにカスタマイズしたものです。プログラムでは次の方法でEMUIのバージョンを取得できます。
“`java
public class EmuiInfo {public static EmuiInfo getEMUI() {
EmuiInfo.Builder builder = new EmuiInfo.Builder();
try {
Class> classType = Class.forName(“android.os.SystemProperties”);
Method getMethod = classType.getDeclaredMethod(“get”, new Class>[]{String.class});
String buildVersion = (String) getMethod.invoke(classType, new Object[]{“ro.build.version.emui”});
【Kotlin研修13日目】暗黙的インテントを利用したカメラ機能の実装
# カメラ機能の実装
`カメラ機能`を実装する方法は、以下の2通り。> 1. `暗黙的インテント`によるOS標準の`「カメラ」アプリ`の利用
> 2. `android.hardware.camera2`APIによる`カメラ機能`の作成# 暗黙的インテントを利用したカメラ機能の実装
[参考: 研修11日目](https://qiita.com/b150005/items/a0053b66b28e16967270)
`暗黙的インテント`を用いて`カメラ機能`を実装する手順は、以下の通り。> 1. `マニフェストファイル`に端末の`ストレージ`を利用するための`パーミッション`を付与
> 2. 撮影した`画像ファイル名`が**一意**となるよう、`SimpleDateFormat`を用いて`日時フォーマッタ`を作成
> 3. `ストレージ`に格納する`画像ファイル名`・`ファイル形式`を指定
> 4. `ContentResolver`を用いてデータの`格納先URI`を作成
> 5. `暗黙的インテント`を用いてOS標準の`「カメラ」アプリ`を起動
> 6. `遷移元アクティビ
DaggerのAssisted Injectを楽にするクラスと拡張関数を作った
# はじめに
DaggerのAssisted Inject、便利ですよね。
私はDagger-Hiltで利用していますが、ViewModelにコンストラクタInjectionできるので重宝しています。
しかし、ViewModelで利用する場合、FactoryとそれをProvideする(companion objectの)関数を書く必要がありますが、ボイラプレートがあると感じたので、クラスと拡張関数を用いて実装を楽にしてみました。
Assisted Injectの対象引数が一つの場合にしか使えませんが、data class化するなど一つにまとめれば、実質複数の値を渡せるので、汎用性はあるのではないかと思います。# 確認環境
確認した環境は以下の通りです。“`kotlin
Dagger-Hilt : 2.35.1
Kotlin : 1.5.10
AGP : 4.2.1
“`# ViewModel向けの便利クラス
関数を共通interfaceとして切り出すことで、無駄をなくします。## 使う側
先にメリットが分かるほうが良いと思うので、まずは利用側から。### Bef
iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(3/3 ライブラリ使い方編)
– [iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(1/3 考え方編)](https://qiita.com/KazaKago/items/1d6477b8d4dc628522e7)
– [iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(2/3 実装方針編)](https://qiita.com/KazaKago/items/213bd4fd0072fb433937)
– [iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(3/3 ライブラリ使い方編)](https://qiita.com/KazaKago/items/63d9c5fb232054dfa8ab) ← **いまここ**# 前置き
[前回](https://qiita.com/KazaKago/items/1d6477b8d4dc628522e7)、[前々回](https://qiita.com/KazaKago/items/213bd4fd0072fb433937)とモバイルアプ
iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(2/3 実装方針編)
– [iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(1/3 考え方編)](https://qiita.com/KazaKago/items/1d6477b8d4dc628522e7)
– [iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(2/3 実装方針編)](https://qiita.com/KazaKago/items/213bd4fd0072fb433937) ← **いまここ**
– [iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(3/3 ライブラリ使い方編)](https://qiita.com/KazaKago/items/63d9c5fb232054dfa8ab)# 前置き
前回「[iOS/Androidアプリにおける状態管理の複雑さにリポジトリパターンを拡張して立ち向かう(1/3 考え方編)](https://qiita.com/KazaKago/items/1d6477b8d4dc628522e7)」という記事を書きまし
双方向性マップ
この記事では、Androidで双方向性マップを使う方法について記載しています。(Javaでも使えます)
### 双方向性マップ
双方向性マップは、「keyを指定してvalueを取得する」だけでなく、「valueを指定してkeyを取得する」ことが出来ます。### 使い方
双方向性マップのライブラリはいくつかあるようですが、ここではcom.google.guavaのBiMapを使います。
ライブラリは、MavenまたはGradleで依存関係を指定することで使用できます。“`
dependencies {
implementation(“com.google.guava:guava:30.1.1-android”)
// Javaの場合は 30.1.1-jre
}
“`「valueを指定してkeyを取得する」場合は、inverseメソッドをコールすることで、keyとvalueが反転したMapが取得できます。
“`kotlin
val userId: BiMap= HashBiMap.create()
userId.pu