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

Android関連のことを調べてみた2021年02月21日
目次

WebViewの高さがガタガタ変わらないようにしたい

WebViewの使い方として正しいかは分かりませんが、WebViewをRecyclerViewやScrollViewに`android:layout_height=”wrap_content”`で配置して、Viewの高さをコンテンツの高さ分持たせるような使い方をしたくなることがあります。
こういったことをするとき、WebViewがコンテンツを読み込んでレンダリングが完了するまで高さが確定しなくて、他のViewの位置も連動して変わってしまう、ってのが悩みです。一方で、WebViewのようなものを配置すると言うことはアプリの更新を行わずコンテンツを柔軟に変更したい等の要求があるはずなので安易に最低限の高さみたいなものを設定する訳にも・・・という悩ましい問題があります。

まずは、最低限の高さを設定しつつ、それ以上になることを許容するという方法を考えてみましょう。
方法は他にもいろいろあるかとは思いますが、View自体の大きさはonMeasureの中でmeasuredWidth/measuredHeightが設定されることによって決まります。
ですので、基準値をstableHeightという

元記事を表示

AndroidのEditTextで入力された文字がメールアドレスかどうか判定する(Kotlin)

##はじめに
初投稿です。Android開発学習中の大学生です。学んだことをまとめて頭の中を整理するために書きます。なので僕と同じ初心者向けの内容です。

##背景
Android開発で会員登録の機能を作っているときに、入力された文字列がメールアドレスかどうかの判定方法がわからず困りました。いろいろ調べたり知人のエンジニアの方に教わったことをまとめます。

##解決方法
大きく分けて二つの方法があります。
1.正規表現でメールアドレスのパターンを作って、それと入力された文字列が合致するか調べる方法。
2.Javaにデフォルトで存在するPatternsクラスのメソッドを用いて調べる方法。

あくまで僕の解釈ですが、1の方が本質的なやり方で2は飛び道具みたいな感じかなと思いました。ただ1の方が正規表現のことを理解していないとできないのでめんどくさめ。あと抜け漏れが発生しやすいかも。まあでも2のやり方も大元では1と同じことやってそう。

##1の方法について
まず、正規表現の概念と定型パターンは
概念 : [https://userweb.mnet.ne.jp/nakama/](https:

元記事を表示

外部通信は非同期で行いましょう

Firebaseなどの外部APIにアクセスするときは必ず非同期処理でかく必要があります。
以前はMVVMでその方法を説明しましたが、Viewに情報を反映しなくていい場合などの状況下ではViewModelは必要ないので、Activity/Fragmentから直接Repositoryを呼び出すことになります。ほぼMVVMとやり方は変わりませんが忘れっぽい私のためにここに残しておきます。
ちなみに、サーバーサイドの処理は非同期にする必要はありません。

“`Activity.kt
private val userInfoRepository = UserInfoRepository()
private val notificationRepository = NotificationRepository()

GlobalScope.launch {
notificationRepository.save(uid, token)
}

GlobalScope.launch {
// 引数のuidと一致するuidのデータを取得
result = use

元記事を表示

Androidでしてはいけない再帰をする

ふと思った
**「`onCreate()`みたいなところで自分をまた呼び出すようにしたらどうなるだろう?」**
結果はわかりきっているがやってみた
## 実際にやってみた
`onCreate()`と言っておいて`onResume()`に書いていますが気にしない気にしない

“`kotlin:LaboratoryActivity.kt
class LaboratoryActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_laboratory)
}

override fun onResume() {
super.onResume()
Log.d(“korehataihennnamisuwokennsyousurutamenomonodesu,Andr

元記事を表示

Kotlin : Realmを用いてcsvファイルをセットする

##はじめに
Realmのデータベースを用いたデモアプリを作成していたとき、データベースが空の状態で登録や削除を行っていましたが、予めcsvファイルをセットしておく方法も試したので、忘れないように残そうと思います。

##build.gradleの設定
projectレベルのbuild.gradleを開き、以下の文をclasspathに加えます。

“`php
classpath “io.realm:realm-gradle-plugin:10.2.0”
“`
次にapplicationレベルのbuild.gradleを開き、以下のpluginを適用します。

“`php
id ‘realm-android’
“`
ここで、言語がkotlinである場合は以下のpluginを適用する必要があります。このpluginは上記の’realm-android’より上に配置してください。

“`php
id ‘kotlin-kapt’
“`
詳しい方法は[こちら](https://docs.mongodb.com/realm/android/install)

##Realmの初期

元記事を表示

kivyに関する備忘録

Androidアプリを作っている際にpythonでGUIを作成したいなと思ったので、kivyというライブラリを使ってGUIを作成することにしました!
今回はメモ代わりに書いているので、正直書いている項目に順番はありません。

また、今回は`Widgetクラス`と`ウィジェット`を区別して書くことにします。カタカナで`ウィジェット`になっている場合は、ButtonやLabelなどのウィジェットだと思ってください。

# 開発環境
* Visual Studio Code 1.53.2
* MacOS Darwin x64 20.3.0
* python 3.7.7(anaconda)

# 参考記事
こちらの記事がわかりやすかったので、参考にさせていただきました。
[Kivy 超入門(6):動的配置 – float レイアウト](http://iatlex.com/python/first_kivy_6)
[Python: Kivy と Matplotlib でデータセットの確認ツールを書いてみる](https://blog.amedama.jp/entry/2019/07/25/060

元記事を表示

Android: Lottie Animation を任意の位置とサイズにオーバーレイ(ViewOverlay)表示させる

# TL;DR

* Lottie Animation を ViewOverlay に表示することで、View Tree に影響を与えずにアニメーション表示させる
* ViewOverlay は Android 4.3 以上で使えます

# やりたいことと問題点

Button タップを起点として Lottie でリッチなアニメーションを表示させるとき、レイアウト上の Button のサイズよりも広い範囲にアニメーションを表示させたいことがあります。

たとえば、 Twitter Android アプリのお気に入り Button UI はタップするとハートマークよりも広い範囲にアニメーションが表示されています。

![heart1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17931/aa690702-f44a-343f-2a8e-f0c1af7736a2.png)

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

元記事を表示

[Android]ViewBindingを使いたい!

###ViewBindingを使いたい理由
xmlファイルでViewに指定したidを用いてアクティビティやフラグメントを書く際、findViewByIdを逐一書かなくて良きなのと、型安全なので記述ミスがなくなる。数か月くらい前に、話題になりましたが、まだ使えてない!時代のビックウェーブに乗り遅れた!という人向けに書いてみました。実装は、簡単です!
https://developer.android.com/topic/libraries/view-binding

“`gradle
// モジュールの方ね!書けたらSync now!
android {

buildFeatures {
viewBinding true
}
}

“`

適当に、Viewを配置して…

“`xml

元記事を表示

react-native-webview で表示するページを Android の戻るボタンで戻れるようにする…のはわりと簡単だけど「戻れるかどうか」をちゃんと判定するのは結構難しいという話

## 概要

単純に「戻る」だけならシンプルに実装できますが、「これ以上戻れるかどうか」により処理を分けたい場合への対応について、 SPA 対応まで含めて説明している記事がなさそうだったのでまとめました。

「Android の戻るボタン」と書いていますが、 UI で「戻る」ボタンを表示しつつ、それ以上戻れないときは非アクティブにするといった対応にも応用できると思います。

## 1. 単純に戻す

WebView の ref を使って以下のようにすれば戻す操作はできます。

“`CustomWebView1.tsx
import {useFocusEffect} from ‘@react-navigation/native’;
import React, {useRef, useCallback} from ‘react’;
import {BackHandler} from ‘react-native’;
import WebView from ‘react-native-webview’;

type Props = {
uri: string;
};

export co

元記事を表示

[Android]Action BarとUINavigationの連携がうまくいかない

#連携?
UpボタンがDestinationの遷移時に自動的に表示されたり、labelが自動的にタイトルに設定されたりすることです。

#原因
初期化処理を
onCreate(savedInstanceState: Bundle?)
ではなく、
onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?)
で行っていたことが原因でした。

ブレークポイントを設定してデバッグすればもっと早く見つかったかもしれません。

元記事を表示

NavigationComponentのSafeArgsを使ってみる

#SafeArgsとは
画面間のデータの受け渡しをタイプセーフに行うためのものです。

#対象者
既存のアプリにNavigationを使用しての画面遷移の導入は難しいけどタイプセーフに画面間でデータの受け渡しがしたい!

##環境
MacBookPro Catalina
Android Studio ver.4.1.2
Kotlin ver.1.4.30

#導入

project配下のbuild.gradleのdependenciesに以下を追加します。

“`gradle:build.gradle
def nav_version = “2.3.3”
classpath “androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version”
“`
続いてapp/build.gradleに以下を追加します。

“`gradle:app/build.gradle#plugins
id ‘androidx.navigation.safeargs.kotlin’
“`

“`gradle:app/build.

元記事を表示

RecyclerViewリファレンスの概説【翻訳】

以下は↓のRecyclerViewについての文章を読みながらざっくり訳しました。

公式リファレンス:[Android Developers > Docs > Reference > RecyclerView](https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView)

## RecyclerView とは
限られた画面の中に大きいデータセットを表示するための、フレキシブルに使えるView。

### 用語集

– Adapter: RecyclerView.Adapterのサブクラスで、データセットの中から表示すべきデータをViewに渡す。
– Position: Adapter内のアイテムの位置
– Index: 適用されている子Viewのインデックス。ViewGroup.getChildAt(int) で使用する。Positionとは対照的。
– Binding: Adapter内のPositionに対応するデータを子Viewに紐づけるプロセス。
– Recycle (v

元記事を表示

【Android】FCMでプッシュが来ないとき

#1.Device Tokenが取得できているかチェック
tokenを取得する方法は2パターンあります。

1.FirebaseMessagingServiceを継承したクラスでonNewTokenをオーバーライドする方法

“`kotlin:MyFirebaseMessagingService
override fun onNewToken(token: String) {
Log.i(“FIREBASE”, “[SERVICE] Token = $token”)
}
“`

2.FirebaseMessaging.getInstance().token.addOnCompleteListenerを実装する方法

“`kotlin:MainActivity
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w(TAG, “Fetchin

元記事を表示

this, baseContext, applicationContextの違い

### 初めに

Androidを勉強する過程で`Context`を使うようになりました。`Activity@this` `baseContext` `applicationContext`とContextと言ってもいくつかあるみたいなので、記事にまとめます!

### Contextとは
– AndroidにおいてContextというと大きく**ApplicationContext**と**ActivityContext**に分類できる
– ApplicationContextは常にアプリで一つであることが保証できる
– ActivityContextはActivityごとに管理しているContextでActivityが破棄(`onDestory`)されるとContextも破棄される
– ユースケースとして`Intent`の`packageContext`引数にはApplicationContextではなくActivityContextを使うべき
– Activity間の繋がりはContextによって作られる(多分)
– AcitivityはContextで

元記事を表示

[Android]Play Publisher Gradle Pluginでリリースした際に、Crashlyticsのログが難読化されたままになる場合の対処法

Android アプリで [Crashlytics](https://firebase.google.com/docs/crashlytics?hl=ja) を使ってクラッシュログを確認していたのですが、ある時から Crashlyitcs のコンソールに表示されるログが難読化されたままになってしまいました。

原因を調査したところ、[Play Publisher Gradle Plugin](https://github.com/Triple-T/gradle-play-publisher) という Gradle Plugin が原因だったのでそれについて共有したいと思います。

## 問題点

Android アプリの開発において [Play Publisher Gradle Plugin](https://github.com/Triple-T/gradle-play-publisher) を使うと、Gradle のタスクで Google Play Console へ APK や App Bundle をアップロードできるようになります。

Issue にもあるのですが、どうやらバ

元記事を表示

【Android】TextView内の文中の装飾

例として、`Hello Wolrd!`の`World`部分を装飾します。

# 文中の文字色・太さ・大きさ・下線・上付き文字・下付き文字
“`strings.xml
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
“`
出力結果:

元記事を表示

Unityでkeystoreファイルを消してしまったら

# あらすじ
「`*.keystore`ファイルをうっかり失くして、こう対処した。」
「`*.keystore`ファイルはちゃんと管理しましょう。」というお話です。

# 発端

UnityでBuildしたものをPlayStoreにアップロードすると、“`Android App Bundle が誤った鍵で署名されています。“`というメッセージが表示されました。何事だ??と確認すると、`*.keystore`ファイルが消えていました。

Plastic SCM でバージョン管理していたはずですが、`Check in`コマンドでステージングしたときに、アップロード内容に含め損ねていたようです。何と私が以前作成した`*.keystore`はもうこの世にありません!

失くしたものは仕方がないので方法を探しましょう。

# 鍵
PlayConsoleにアップロードするときには、アプリ本体、apkまたはaabと一緒に鍵がアップロードされます。

この鍵は最初にアップロードされるときにPlayConsoleに登録され、以降のアップロードでは同じ鍵が必須です。

![image.png](htt

元記事を表示

新しいAndroidランタイムパーミッションのAPIを使ってみる

Android 6.0で導入されたランタイムパーミッションですが、定型文が多い上に結果の受け取りが`onRequestPermissionsResult`のオーバーライドによる非同期処理となるため非常に使いづらく、ややこしくなりがちでした。昔記事を書いていたのがこちら。
https://qiita.com/niusounds/items/f8852534bd3135d89dcc

そんなランタイムパーミッションのAPIが、`androidx.activity 1.2.0`でより使いやすくシンプルなAPIになりました!

たとえば`startRecordButton`というボタンを押すと端末のマイクから音声入力を録音する処理`startRecording()`が実行されるアプリを作っているとしたら、以下のような感じのコードになります。

“`kotlin
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onC

元記事を表示

adbからスクショを連続で撮ったときに、画像ファイル名に自動で通し番号をつける

adbからスクショを連続で撮ったときに、画像ファイル名に自動で通し番号をつけるコマンド。

“`sh
# 準備 最初に一回だけ実行
i=1

# スクショ撮影 & 取得
adb shell screencap -p /sdcard/screen_$i.png && adb pull /sdcard/screen_$i.png && i=$(($i+1))
“`

## 参考
adb 経由の screenshot の取り方
https://qiita.com/TNaruto/items/b2407f5668e15e42bedd

元記事を表示

Rxを使ってIllegalStateExceptionを回避する

## はじめに
[こちらの記事](https://qiita.com/nein37/items/32613e9acd9558566c5e)を参考にさせていただきました。
Androidで非同期処理を実装していると、IllegalStateExceptionというExceptionが発生することがあります。
これは、onSaveInstanceStateより後のタイミングでFragmentTransactionをcommitしていることが原因で発生するものです。
例えば、APIを叩いてそのレスポンスを受けての処理やタイマーで時限式に動く処理など、アプリがバックグランドにある間に処理が走って、ダイアログを表示したり、次のFragmentに遷移したりするケースがこれに相当するかと思います。

回避方針の詳細説明は他にも記事がたくさん出てくるのでそちらに譲りますが、簡単に言うと`onPause ~ onResumeの間`でFragmentTransactionをcommitしないようにすればこの問題を回避できます。
この記事ではRxを使って、`onPause以降`に走る処理を`onResume

元記事を表示

OTHERカテゴリの最新記事