AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

Android

?attr/selectableItemBackgroundは何色か

答え: アプリ・Activityに適用しているテーマ、起動するAndroid OS VersionとcompileSdkVersionとサポートライブラリのバージョンによる。 Theme.AppCompat.Light を使っていてAndroid 5.0以上でcompileSdkVersion 28でAndroidXなら #21000000 以下解説 ?att…

Droidkaigi 2019に参加しました

2019/2/7~2/8に行われたDroidkaigi 2019に参加してきました。 droidkaigi.jp 弁当おいしかった。 バリスタさんは長蛇の列でした。おいしかった。 今年はコントリビュートしました(左上) パーティーはめっちゃ人がいました... 以下参加したセッションのメモ…

Gradle plugin 3.3へのアップデート

先日Android Studio 3.3と共にGradle plugin 3.3.0がきたのでアップデートしてみた。 Crashlyticsを使っているとWarning WARNING: API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with 'variant.getExternalNativeBuildPro…

個人アプリのAndroidX対応時のメモ

Support Libraryに依存した3rd party libraryが入っていないせいかあっさり終わった。 移行前の環境 Android Studio 3.2.1 compileSdkVersion 28 targetSdkVersion 28 Support Library 28.0.0 Refactor -> Migrate to AndroidX ほぼこれで終わる。ただこれだ…

FragmentでViewPagerを使うときにFragmentPagerAdapterに渡すFragmentManagerの注意点

嵌ったのでメモ。 BottomNavigationBar のタブの Fragment 内で ViewPager を使っていて、そのタブから別タブに切り替えて再びそのタブに戻ってきたとき、FragmentPagerAdapter#getItem() が呼ばれず、 ViewPager 内が再読込みされない現象が起きた。 調査の…

【Android】続・PreferenceFragmentCompatを使った設定画面

以下の記事を昔に書いたが、内容が古くなってきたようなので書き直す。 phicdy.hatenablog.com Androidの設定画面について AndroidではAPI1から設定画面を生成してくれる PreferenceActivity が用意されている Android 3.0で各設定画面をFragmentに分けるた…

Clean ArchitecutureにおけるKotlin coroutinesの処理と責務分け

自分の中で混乱してきたので整理する。 環境 Kotlin 1.2.71 Kotlin Coroutines 0.30.1 本題 以下のようなClean Architecuteベースの設計のアプリがあるとする。 このときKotlin Coroutineを使って非同期処理を行ってUIを更新するとする。 各クラスの責務を分…

Kotlin Fest 2018に参加した

2018/8/25に品川で開催されたKotlin Fest 2018に参加してきました。 kotlin.connpass.com 飲み物とか食事。パンプディング美味しかった。 mixiさんブースでやってKotlinクイズの景品。7問中3問正解でプランニングポーカーもらいました。 以下参加したセッシ…

【Android】他のアプリの上に重ねて表示まとめ

Androidの世界では基本的に1アプリのみが前面に出る。 しかし android.permission.SYSTEM_ALERT_WINDOW を宣言することで他のアプリが前面の場合でも Viewを表示できる Android 6.0未満 制限はなく、 android.permission.SYSTEM_ALERT_WINDOW を宣言するだけ…

【Android】Google AnalyticsからFirebaseへの乗り換え

Firebaseを使ってみたかったので置き換えてみた。 プロジェクトのbuild.gradle dependencies { ... classpath 'com.google.gms:google-services:4.0.0' } アプリのbuild.gradle dependencies { ... implementation "com.google.firebase:firebase-core:16.0.…

targetSdkVersion 26でAndroid 2.3をサポートすることのコストの高さ

今年の11月以降、Google PlayにはtargetSdkVersion26(Android 8.0)以上のアプリしかアップロードできなくなる(新規アプリは8月)。 developers-jp.googleblog.com それでも状況によってはAndroid 2.3をサポートしなければならない場合がある・・・ しかし、…

【Android】リリース署名の設定をプロジェクト外から上書きする

GitHubでソースを公開していてリリース署名の設定をしたい場合、公開用にはダミーの署名を置き、手元ではそれを上書きしたい。かつ git status でnot stagedのところに上書き内容がいちいち出ないようにプロジェクト外から上書きしたい。 gradle.properties …

【Android】Toolbarの矢印をタップしたら画面を閉じる

ポイントはonOptionsItemSelected()でandroid.R.id.homeをハンドリングしないと反応してくれない点 class MainActivity: AppCompatActivity { ... override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate menu resource file. menuInflater.in…

RxJavaのflatMap(mapper, combine)でリストデータをそれぞれ別スレッドで非同期処理する

例えばRSSのリストがあり、それを別々のスレッドで処理して全部の処理が終わったらUIを更新したいとする。 RxJavaのflatMap(mapper, combine)を使えばリストのデータを1つ1つのObservable/Flowableに変換して処理できる。 まず第一引数のmapper部分でそれぞ…

kotlinのファイルをjacocoのコードカバレッジ対象に入れる

久し振りにjacocoの結果みたらあれ・・・なんか結果がおかしいなとなった。 よく見てみるとkotlinに変換したファイル達がコードカバレッジ対象から外れていた・・・ phicdy.hatenablog.com 以下で対応できた sourceDirectories に src/main/kotlin を入れる…

java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

UIテストを実行しようとしたらエラー・・・ ひとまずRun with --stacktraceを押してみる。 ... Caused by: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 at com.android.dx.merge.DexMerger$8.updateIndex(DexMerger.ja…

emulator: WARNING: HAXM 6.0.5 is installed. Please install HAXM >= 6.2.1 to fix compatibility issues on Mac

6.2.1入っているように見えるのに怒られる・・・ 再インストールしたら直った。

totoを予想するアプリをGoogle Playに公開できなかった話

結論:前もって規約を読んでおけ Gambling | Restricted Content - Developer Policy Center 現在は公開中ですが、最初に公開しようとしたときには公開できませんでした。 play.google.com 規約によるとオンライン ギャンブルを推進するコンテンツおよびサー…

KotilnでTheoryとDataPointsを使ったJUnitのパラメータテストを書く

Kotlinに何も考えずにTheoryとDataPointsを使ったテストを書こうとするとデータがJUnitから参照できずエラーになる。 Kotlinにstaticはないのでcompanion objectを作って@JvmFieldをつけることでJUnitから参照できるようになる。 @RunWith(Theories::class) …

【Android】Activityを2重で開かないようにする

なにも考えずに実装を行うとActivityが2重で開いてしまうことがある。 例えばボタンを押して次のActivityが開くとき、そのActivityやIntentに設定をしていなければ、素早く連打することで2重に開くことができる。 修正方法 AndroidManifestでActivityのlaunc…

【Android】画像が押されたときの背景を簡単につける

ImageButtonを使えば簡単にできたので自分用にメモ。 <ImageButton android:id="@+id/ib_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/your_imgae" android:background="?android:selectableItemBackground" android:contentDescription="@string/your_image_desc" /> 参考 stacko…</imagebutton>

Android通知のバージョンごとのUIの違い

自分用にメモ。以下のコードを実行したときのAndroid OSバージョンごとのUIを調べた。 Intent intent = new Intent(context, MainActivity.class); PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); …

CircleCIでAndroid SDKとGradleをキャッシュする

CircleCIで普通にビルドしていると毎回Android SDKとGradleのダウンロードが行われてビルド時間が長くなってくる。CircleCIにはデフォルトのキャッシュ以外にも自分でキャッシュの設定ができるので、Android SDKとGradleをキャッシュすることでビルドを短く…

【Android】jacocoでコードカバレッジを取る

最近UTを書くようになってきたのでカバレッジを取ってみました。Gradleにjacocoのプラグインがあるのでそれを使います。 build.gradleはDroidkaigi2017のbuild.gradleを参考にしました。 apply 'jacoco' apply plugin: 'com.android.application' android { …

【UI Automator 2.0】UiObject2#longClick()が効かない問題の対策

UI Automator 2.0を使ってListViewのContextMenuのテストを書きたかったのですが、UiObject2#longClick()ではどうもまくいきませんでした。 動きを見る感じロングクリックの時間が短いですね・・・ 調べるとUiDevice#swipe()でロングクリックしたい場所の座…

【Android】SQLiteのテーブルからカラムを削除する

ALTER TABLE mytable DROP COLOMN mycolomnを実行すれば完了・・・と思いきや、SQLiteはDROP COLOMNをサポートしていないらしい。 http://www.sqlite.org/faq.html#q11 そのため、以下の手順でカラムを削除した テーブルのデータを全て取得 DROP TABLEでテー…

【Android】UI Automator 2.0でUIテストをする

UI AutomatorはGoogleが開発しているAndroid向け自動UIテストフレームワークです。 2015年3月にバージョンが2.0になりGradleに対応しました。 有名なテストフレームワークのAppiumも中ではUI Automatorを実行しています。 Espressoとの違い Googleはテストフ…

【Android】MaterialShowcaseViewライブラリでチュートリアルを実装する

MyCurationの1.2.1でチュートリアルを追加しました。というのもインストールされてもすぐアンインストールされているようで、説明が足りなかったかな・・・と思い始めたためです。 実装を自分でやってもよかったのですが、デザイン的なセンスがないのと、あ…

【Android】App Standbyがわからない

App StatndbyはAndroid 6.0になって追加された省電力の機能である。 Doze と App Standby 用に最適化する | Android Developers アプリが以下の場合でないとき、そのアプリは"Idle"状態になり、"Idle"状態が長時間続くとバックグラウンドでの通信を1日1回し…

【Android】 リモートリポジトリに繋がらない環境でJUnitを実行する

ネットワーク環境に問題がないときは、Googleのページのやり方で設定すればJUnitの環境設定は簡単だけど、Proxyなどでmaven centralに繋がらない場合の対処法 jarファイルのダウンロード リモートリポジトリに繋がらないので、jarファイルをlibsフォルダに置…