Android関連のことを調べてみた2021年09月18日

Android関連のことを調べてみた2021年09月18日

【Flutter】ListViewでD&Dソートに対応しつつ並び順を保存する

###はじめに
Flutterだとドラッグアンドドロップで並べ替え可能なListView自体はかなり楽に実装できるのですが、ネイティブ同様(?)並び順の保存に関しては自前で作る必要があります(たぶん)。
もし適当に保存しようものなら並べ替えやアイテムの追加・削除でごちゃごちゃになってしまいます(経験済み)。
なんとなく一番簡単そうな方法を書き綴っておきますので良ければ参考にしてみてください(もっといい方法があればコメント頂けると嬉しいです)。
因みにFlutterは始めたばかりなのでおかしなところがあるかも知れません。

それとListView自体の実装とSQL関連の詳細説明は省略しますので適宜調べて貰えると幸いです。

###前提
ListViewに並べるアイテムはDBに実装済みのものとします。
今回は以下のアイテムを用意して進めます。

“`dart:item.dart
class Item {
var id;
var title;
var sort;
//その他省略
}
“`

###実装

#####ListViewの実装
先ずはD&Dソート可能なListV

元記事を表示

THETA新機能バースト撮影方法

こんにちは。 @mShiiina です。
今回は、[RICOH THETA Z1のファームェア V2.00.1](https://support.theta360.com/ja/download/firmware/z1/) から搭載された新機能、バースト撮影について解説します。

## バースト撮影とは

まず、バースト撮影について説明します。
THETAにはもともとインターバル撮影という、連続して写真を撮影する機能があります。
インターバル撮影は一定間隔(2秒間隔以上)で撮影する機能であり、タイムラプス動画を撮影したいときなどに使える機能です。
バースト撮影は連続して写真を撮影するというところはインターバル撮影と同じですが、撮影間隔が最短で数十ミリ秒で可能な撮影です。
さて、バースト撮影はどんなときに有効な撮影方法なのでしょうか?
よく使われるのは小さい子どもや動物など自由に動いてしまう被写体を撮影するときに、ベストショットを逃さないために撮影します。短い間隔でたくさん撮影することで、そのうちのどれかはいい写真になるはず!という心意気で撮影します。
![MicrosoftTeams-

元記事を表示

TWRPでError: 7が出るときに試してみる事

#ERROR: 7
先ほど出たエラー名でググってみたものの情報が少なかったので(基本すぎて?)共有しようと思いました。

“`
mkdir “/cache/recovery/2bdde85…./”
failed: No space left on device
E1001: Failed to update system image.
Updater process ended with ERROR: 7
Error installing zip file ‘/sdcard/TWRP/lineage17.zip’
“`
上記のエラーがlineageをtwrpでインストールしようとしたところ出ました。
ストレージに十分スペースは空いています。

#解決策

cacheとdalvik-cacheをwipeしたのち再度インストールを試みたらエラーは出なくなりました。

#環境
– Lenovo Z5ProGT
– Lineage-17.1
– TWRP-3.3.1-1004

#最後に
今後同じエラーに遭遇した方の解決時間短縮に貢献できれば幸いです。

元記事を表示

rememberLazyListState の仕組み

## 疑問

次のコードは、表示されている要素のインデックスの中で最も小さいものをログに出力するコードです。出力されるタイミングは値が変わったとき、つまり一方向にゆっくりと `64dp` スクロールしたときです。私の環境では `1dp = 2.75px` であるため、`176px` 毎に出力されることになります。

“`kotlin
data class Data(val id: Int)
val data = (1..1000).map { Data(it) }

@Composable
fun MainScreen() {
val state = rememberLazyListState()
Log.e(“TAG”, state.firstVisibleItemIndex.toString())

LazyColumn(Modifier.fillMaxSize(), state = state) {
items(data, key = { it.id }) {
Box(Modifier.border(1.dp, Color.Black).fill

元記事を表示

Jetpack Composeで、Mutable系統をStateに登録したらあかん

Mutable系統をStateに入れていて、数日ドツボにはまったのでメモしておきます。

# 問題

Jetpack Composeの勉強のために、以下のようなアプリを作成しました。

![スクリーンショット 2021-09-16 221859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674896/0da3bc47-e6fa-a1e2-6e7e-b7a70b453272.png)

ソースコードは以下の通りです。

“`kotlin:List.kt
@Composable
fun List(){

//表示するStateを作成
val list by remember { mutableStateOf((0..3).toMutableList()) }

LazyColumn(Modifier.fillMaxSize()){

//カラムを表示する部分
item{
for(i in list)

元記事を表示

JUnit5の@ParameterizedTestがAndroidStudioで認識されない

複数の引数を入れて期待値が得られるかをテストするには、
JUnit5のParameterizedTestが便利らしいので導入しようとしました。

## gradleに導入

“`gradle
testImplementation ‘org.junit.jupiter:junit-jupiter:5.5.2’
testImplementation ‘org.junit.jupiter:junit-jupiter-api:5.5.2’
testImplementation ‘org.junit.jupiter:junit-jupiter-params:5.5.2’
testRuntimeOnly ‘org.junit.jupiter:junit-jupiter-engine:5.5.2’
“`

## Testは認識されるがParameterizedTestが認識されない

unresolvedになってしまう
![Screenshot 2021-09-16 194455.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws

元記事を表示

Flipper の導入

### Flipper

Androidで、デバッグする際、logcatを確認することは多いと思いますが、DBの中身だったりレイアウトのチェックなどは出来ません。
そこで、プラグインを導入することで、デバッグすることが可能な Flipper を紹介したいと思います。
Flipperは、Facebook製のデバッグツールです。
Androidからの通知をPCのデスクトップアプリにGUIツールです。

* [Flipper](https://fbflipper.com/)
* [Github](https://github.com/facebook/flipper)

### Flipper の導入

* Gradleに定義

“`gradle:build.gradle.kts
debugImplementation(“com.facebook.flipper:flipper:0.104.0”)
debugImplementation(“com.facebook.soloader:soloader:0.10.1”)

releaseImplementation(“

元記事を表示

Jetpack Compose でログインフォームを作る

## はじめに

Jetpack Compose で入力フォームを作成する方法を記載します。画面に配置する要素は3つで、メールアドレス入力欄、パスワード入力欄、ボタンです。

Empty Compose Activity から作り始めた場合、おそらく追加のパッケージは必要ありません。

## 実装

まずはメールアドレス入力欄の実装です。

“`kotlin
@Composable
fun EmailTextField(
value: String,
modifier: Modifier = Modifier,
onValueChange: (String) -> Unit,
) {
val focusManager = LocalFocusManager.current
OutlinedTextField(
value = value,
onValueChange = onValueChange,
modifier = modifier,
keyboardOptions = KeyboardOptions(
keybo

元記事を表示

【Kotlin】冗長的なレイアウトファイルからの脱却

アンケート画面などで複数のTextViewやCheckBoxが繰り返し表示される画面を作成するときレイアウトファイル(.xml)が冗長的になってしまうことがあるかと思います。
以下の画像のようなチェックボックスが複数個並んだViewを作成するとします。

この時のレイアウトファイルとして真っ先に考えられるのはこんな感じかなっと思います。

“`.xml

プログラムでOSはHarmony(HarmonyOS)かAndroidか判断する方法

ファーウェイは2021年7月23日に[HUAWEI MatePad 11](https://consumer.huawei.com/jp/press/news/2021/news-210713/)をリリースしました。このタブレットはHarmonyOSを搭載しています。AndroidのアプリもHarmonyOSのアプリも正常動作します。

アプリの中でOSがHarmonyOSかAndroidか判断する場面があるかもしれないので、その方法を公開します。

“`java
public boolean isHarmonyOS() {
try {
Class classType = Class.forName(“com.huawei.system.BuildEx”);
Method method = classType.getMethod(“getOsBrand”);
ClassLoader classLoader = classType.getClassLoader();
if (classLoader != null

元記事を表示

Universal Android Music Player(UAMP)のカスタマイズ (メニューの変更 2)

#はじめに
Android用アプリのプログラミングを学ぶため、Googleが公開しているサンプルコード **Universal Android Music Player(UAMP)**をカスタマイズしてみます。

メニューをカスタマイズするために、オリジナルのコードの動作を確認します。
今回は、メニュー画面で項目がタップされてから下位のメニューを表示するまでの動作を確認します。

#環境
####PC
MacBook Pro 16
2.3 GHz 8コアIntel Core i9
16 GB 2667 MHz DDR4
macOS Big Sur ver.11.5.2

####開発用SW
Android Studio 4.2.1

####Target Device (Virtual Device)
Category: Phone
Name: Pixcel 2
Resolution: 1080×1920 420bpi
API Level: 28
Android: 9.0
CPU: x86

#コードの確認
###メニュー項目の選択(下位のメニューが存在する場合)
メニュー画面で項目が

元記事を表示

Flutterで手書きを実装する

# 実装する機能

今回実装する機能は、

– 自由に画面をなぞると特定の範囲内で手書きで絵が描けるようにする
– ひとつ戻る(undo)ひとつ進む(redo)ボタンの実装
– 全部消すボタンの実装

になります。類似した機能が入ったアプリだと消しゴムが入っていますが、今回のアプリではそこまで必要性を感じなかったため実装しません。

# パッケージ・バージョン

Flutterのバージョンは`2.2.0`です。

使用するパッケージは状態管理のために`hooks_riverpod`と`statenotifier`、`freezed`を使います。
特にそれ以外のパッケージは使用しません。
バージョンは以下の通りです。

“`yaml:pubspec.yaml
dependencies:
flutter_hooks: ^0.17.0
freezed_annotation:
hooks_riverpod: ^0.14.0+4

dev_dependencies:
build_runner:
freezed:
“`

# 手書きの実装

## 土台の作成

本題の実装に

元記事を表示

[Mockk]SystemClockをモックする

`mockkStatic()`を使います。

“` Test.kt
class Test {
@Test
fun systemClockTest() {
mockkStatic(SystemClock::class)
every { SystemClock.elapsedRealtime() } returns 100L
assertThat(SystemClock.elapsedRealtime()).isEqualTo(100L)
}
}
“`

元記事を表示

Android + Kotlin での HTTP リクエストの方法

## はじめに

Firebase Authentication の ID トークンを HTTP ヘッダに付与したり、独自データと JSON 文字列間の変換を行ったりすることはよくあるのですが、頻繁に使う割に忘れるので記事として残します。

## 環境

build.gradle は次のような内容になっています。

“`groove
plugins {

id ‘org.jetbrains.kotlin.plugin.serialization’ version ‘1.5.21’
id ‘com.google.gms.google-services’
}

dependencies {

implementation “androidx.navigation:navigation-compose:2.4.0-alpha06”
implementation platform(‘com.google.firebase:firebase-bom:28.4.0’)
implementation ‘com.google.fir

元記事を表示

【Android】Looper を持つスレッドの CoroutineDispatcher を作る

関連記事:[【Kotlin/JVM】CoroutineDispatcher を作る](https://qiita.com/sdkei/items/a056a1275b05b11ddcd4)

次のようにすることで `Looper` を持つスレッドの `CoroutineDispatcher` を作ることができる。

“`Kotlin
import android.os.Handler
import android.os.HandlerThread
import kotlinx.coroutines.*
import kotlinx.coroutines.android.HandlerDispatcher
import kotlinx.coroutines.android.asCoroutineDispatcher

val handlerDispatcher: HandlerDispatcher =
HandlerThread(“HandlerThreadDispatcher”)
.apply { start() }
.looper

元記事を表示

[Coil]キャッシュサイズを変更する方法

Androidの画像ローディングライブラリ[Coil](https://coil-kt.github.io/coil/)でディスクキャッシュのサイズを変更する方法を調べたのでメモがてら記事にします。

###方法
Coilは[OkHttp](https://square.github.io/okhttp/)のディスクキャッシュ機構を利用しています。
したがって、キャッシュのサイズを変更するにはOkHttpClientを置き換えます。

“` Coil.kt
val cache = Cache(
directory = File(context.cacheDir, “image_cache”),
maxSize = 500L * 1024L * 1024L // 500 MB
)
val imageLoader = ImageLoader.Builder(context)
.okHttpClient {
OkHttpClient.Builder()
.cache(cache)
.build()

元記事を表示

【Android】ViewPager2+FragmentStateAdapterでFragmentを置き換える

ViewPager2 + FragmentStateAdapterでFragmentを追加・削除しようとしてハマった時のまとめ。

##やりたいこと

* ViewPagerにセットしたFragmentを別のFragmentに置換したい


##方針

Android Developersに以下のような記載がありました。

>ViewPager2 は、編集可能なフラグメント コレクションのページングをサポートしています。基盤コレクションが変更されたときに、notifyDatasetChanged() を呼び出して UI を更新します。
これにより、アプリは、実行時にフラグメント コレクションを動的に編集できるようになり、編集されたコレクションを ViewPager2 が正確に表示します。

https://developer.

元記事を表示

孫から祖父へテレビ電話(LINEのできるタブレット)をプレゼントした話

# この記事では
齢80を超えた祖父に孫(筆者)から初めてのスマホ(タブレット)をプレゼントしてLINEでおしゃべりするようになるまでを振り返ります。
なお「孫」の発音は「**ま**ご」。

##発端
新型コロナの流行拡大が止まらない2020年。田舎の祖父(農家。パソコンはワープロ、ネット環境はない)が高熱で入院。
ごく小さいながら年相応に前立腺がんがあり、その治療でトイレが近くなっていたらしい祖父は水分を控えて結果膀胱炎か何かになったらしい。

## 何が起こった
コロナ時代の入院といえば面会制限。
面会できるのは1人だけ、1日30分。洗濯物を引き取らなければならないし、日々の細かな対応も必要というので面会者になったのは祖母(パソコンもワープロも知らない、電話は固定電話のみ)。
車で1時間のところに住んでいる叔父が駆けつけるも、面会制限に引っかかって門前払い。会話はできる状態らしいと聞けば、声が聞きたいし聞かせたいのが心情というものでしょう。
この時点で入院は1か月くらい?と言われていた。そんなこと言われたら叔父も母も(もちろん私も)余計に声が聞きたくなるじゃないか。
そこで叔父、

元記事を表示

Application を ViewModelStoreOwner にする方法

## はじめに

気軽に Activity 間でデータを共有する場合は、Application を継承したクラスを ViewModelStoreOwner にすると良いです。このように設計することで、Application を継承したクラスが肥大化することなく、Application にグローバルな値を持たせることができます。

## 実装

“`kotlin
class MyApplication : Application(), ViewModelStoreOwner {
private val store = ViewModelStore()
override fun getViewModelStore(): ViewModelStore {
return store
}
}
“`

Application の実装はこれだけです。今後グローバルな状態が増えたとしても、Application が肥大化することはありません。代わりに ViewModel の数が増えます。

## 使用例

次のコードは、`SubActivity` で加算した値が `MainAc

元記事を表示

AlertDialogのカスタマイズその1:引数を渡そう

何かと便利な`AlertDialog`ですが、引数を渡してその内容を表示させることも簡単にできます。
ViewBindingを使い柔軟にカスタマイズすることもできますが、今回はシンプルにテキストのみを呼び出し元から渡すサンプルを実装してみたいと思います。

# AlertDialogについて
基本的にAndroidのDialogは`タイトル`、`コンテンツエリア`、`PositiveButton`、`NegativeButton`、`NeutralButton`といった部品で構成されています(ボタンの総称を`ActionButton`とも言います)。
ダイアログサンプル.png
Dialogとしては`AlertDialog`が最もよく使われ、Alertとはありますが別に警告に限らず様々な用途で使うことができます。

元記事を表示

OTHERカテゴリの最新記事