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

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

Viewを突き出して表示させたい

#初めに
Viewを突き出して表示したい
Viewを他のViewと重ねて表示したい
そんな時のためにやり方を残しておきます

#コードでxmlに書いていく

元記事を表示

JetpackComposeでJavaクラスを引数にとるとスマートコンポジションが効かない(1.1.0-rc03時点)

# TDTR
## どういう現象が発生し得るか?
* Composable関数の入力値にJavaで書かれたクラスがある場合、スマートコンポジションが効かなくなってしまう場合があるようです。
つまり、__入力値が前回と今回で全く同じであったとしても、毎回再コンポジションが発生してしまうということ__です。

## 回避するには
クラスに@Stable or @Immutableアノテーションを付与しましょう。

* 公開プロパティが全て不変である場合は、@Immutalbeを付与しましょう。
* 公開プロパティの変更をComposable関数に通知したい場合(再コンポジションを発生させたい場合)は、@Stableを付与しましょう。

__ただし、闇雲に上記アノテーションを付与すると、再コンポジションの仕組みがうまく行かない場合があるため、アノテーションを付与できる細かい条件は下記公式ドキュメントを参照して下さい!!__
https://developer.android.com/jetpack/compose/lifecycle?hl=ja#skipping

# 詳細
## 前提

元記事を表示

MotionLayoutの例を試してみる(カスタム属性編)

前回は基本的なモーションをやりました。
[前回の基本的なモーション](https://qiita.com/yuta317/items/7a81ddcda30afc8e45d2)

今回はカスタム属性を試してみようと思います。

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

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

# カスタム属性

今回はビューの移動に伴ってビューの背景色を変更しようと思います。

こんな感じです。

![カスタム属性.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/8075cd7e-ba93-0b1c-e92a-fd11e8db46c6.gif)

“` sample_scene.xml

元記事を表示

【Android】アプリのローカライズ(海外言語対応)する方法について

# 海外言語の対応について
よく越境とかインバウンドとか聞きますが、ようするに海外言語に対応して表示する文字列を英語とかフランス語とかに対応させようって話で
Androidではどうやるのっていうのを記載します。

# ユーザによる言語変更のイメージ

私のOPPO端末でのイメージ画像ですが、このように言語設定変えることを指しています。

![Screenshot_2022-01-30-17-45-56-94_png_と_Screenshot_2022-01-30-17-45-52-56_png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/3796c948-39c3-a2a6-dc0e-a44cf8ca6491.png)

# 開発側でどこを変更するのか

※公式を参考に説明しています。~~知っている風に書いててごめんなs~~
https://developer.android.com/guide/topics/resources/localization?hl=ja

## Androi

元記事を表示

ViewBindingをonViewCreated以外でも使う時とonViewCreatedでしか使わない時

#使い分けが必要
`ViewBinding`を`onViewCreated`以外でも使う時と`onViewCreated`でしか使わない時とでは書き方が異なる。できるだけ、変数のスコープが狭くしたいという意図がある。また、今回はFragmentの`onViewCreated`においての話であるが、Activityの`onCreate`に関しても同様である。

## onViewCreated以外でも使う時

“`kotlin
private var _binding: FragmentHomeAllBinding? = null
private val binding
get() = _binding!!

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

_binding = FragmentHomeAllBinding.bind(view)
binding.allRecycl

元記事を表示

【2022年版】OpenCV for Androidのlibopencv_java4.soのバイナリサイズを減らし、APKのサイズを減らす

# はじめに

## Qiitaマイルストーン

2019年01月20日に投稿した記事「[OpenCV for Androidのlibopencv_java4.soのバイナリサイズを減らし、APKのサイズを減らす](https://qiita.com/tfandkusu/items/188d51b5c1c76dd540fd)」ですが、おかげさまで3年かけて10LGTMを達成して、Qiitaマイルストーンで紹介されました。

## 現在ではできない方法

そこで3年前のやり方は2022年1月現在で可能なのかやってみたところ、できなかったです。そこで新たにやり方を調べたので紹介しようと思います。

# Dockerを使ってビルドする

結論からいうと、MacではDockerでビルドできました。Macネイティブではできなかった理由は後で解説します。

## 全体ソースコード

今回のソースコードはGitHubで公開しています。
https://github.com/

元記事を表示

Clound Functionsで特定のAndroidアプリのみ許可する

# はじめに
こんにちは。Androidエンジニアのgottieです。
個人開発でCloud Functions(GCP)を使ってみたのですが、APIのアクセス制限の方法が少しやっかいだったため記事にしておきます。

# やりたいこと
特定のAndroidアプリからからのみ、GCPのAPI呼び出しを行えるようにしたいです。

# やったこと

**1 APIキーの作成**

GCPの「APIとサービス」から「認証情報」>「認証情報を作成」>「APIキー」を選択します。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2130833/d5f5c94a-5449-8dc9-7e4f-56afc54a7d5b.png)|
|:–|

作成したAPIキーの詳細に移動すると以下の画面が表示されます。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2130833/9ceb9088-5

元記事を表示

[Android]Androidアプリ開発でのNend広告実装方法[Nend広告]

# はじめに

Qiita初投稿になります。

私はAndroidでアプリ開発を勉強しています。
去年、作ったアプリを初めて公開することができました。

https://play.google.com/store/apps/details?id=com.chaba_lab.kitchen_timer

今回はそのアプリにNend広告を実装しましたので、その時のことを記事にしたいと思います。

基本的にはマニュアルがわかりやすいので、そこまでつまずくことはないかなと思いますが、一部わからない部分が自分はありましたので、メモに残しておきたいと思います。

よろしくお願いします。

# 環境

– nend-sdk : 8.0.1
– AndroidStudio Arctic Fox 2020.3.1
– 使用言語 Kotlin

# 目次

– [はじめに](#はじめに)
– [環境](#環境)
– [目次](#目次)
– [nendのメディア会員に登録](#nendのメディア会員に登録)
– [アプリの登録と広告枠を作成する](#アプリの登録

元記事を表示

【Flutter】そのおじさん、オーバーフローしてませんか?

# プロローグ

Flutterの勉強を始めて1ヶ月。
Aさんの元についに初めての案件が!

**「おじさんが痩せたり太ったりするモバイルアプリ作成」**

仕様を見ると、
**「スクロールなしの1画面に文字とボタンとおじさんの画像を表示するだけ」**
らしい。

簡単そうだったので、Aさんは早速作業開始!
意気揚々に作り始めて30分。

Aさん 「できました!」
と自信満々にクライアントに見せる。 g

早速 **iPhone13** で確認作業が始まる。

クライアント 「うん、いい感じ!SafeAreaの対応もばっちりだし!!」

…でも、 **iPhoneSE 第一世代で確認すると、あららら?**

【AndroidStudio】 便利なAuto Import機能でimportの手間をなくす

# Unresolved reference: ○○
このようなエラーはAndroidStudioで開発しているとよく起きますね。
使いたいクラスや機能などをimportしてないことから起きています。

解決方法としてはOption + Enterキーを押すかImportをの箇所をクリックするとimportコードが記載されて突破できます。
今回はその手間をなくす方法の紹介です。

![スクリーンショット 2022-01-30 11.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/f2be6021-c83f-3d55-89ba-6b0011e7bcd6.png)

# Auto Import機能の追加方法

## Android Studio > Preferencesを開く

ここではAndroidStudioの環境設定をしています。
変えたいことのない設定は多くありますが、設定の変更はここで可能です。

![スクリーンショット 2022-01-30 11.13.38.png](

元記事を表示

パーミッションを要求するためアプリの設定画面へ飛ばす【Swift/Kotlin】

# はじめに

Android、iOSに限らず、アプリがBluetoothやカメラを利用する際にはユーザがその権限を許可する必要があります。

許可を求めるポップアップが表示され、そこで「許可する」「許可しない」をユーザが選択します。
「許可する」が選択された場合は特に問題ありませんが、「許可しない」が選択された場合は、もう一度許可を求めたり、設定画面から許可するように促す必要があります。

設定画面から許可を促すために設定画面へ飛ばすコードを以下に記述します。

# iOS

以下のコードでアプリの設定画面へ飛ばすことができます。

“`.swift
if let url = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
“`

以下の画面に飛び、権限の許可ができます。
![名称未設定3.jpg](https://qiita-image-store.s3.ap-northeas

元記事を表示

argumentsを使いactivityからfragmentにオブジェクトを渡す【Android】【kotlin】

フラグメントに値を渡すやり方を備忘録として残します。

activityからactivityへの値の受け渡しはintentを使いました
fragmentに値を渡すときにはargumentsというfragmentが持つプロパティをつかいます。

argumentsはBundleという型のプロパティです。
値を渡すにはBundleのインスタンスを作り、BundleにputIntなどで値を渡します。

オブジェクトを渡す方法は、、、
main.Activity内でfragmentクラス、Bundleクラスをインスタンス化する
インスタンス化したbundleにputParceLable(キー, オブジェクト)
fragmentクラス.arguments = bundle
と繋ぐことで対象のfragmentへオブジェクトを渡すことができる。

前提としてデータクラスを使い@Parcelizeを実装してるとする。

“`main.Activity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCr

元記事を表示

CoordinatorLayoutについて

#はじめに

##早速実装

パレットからAppBarLayoutをconstraintLayoutとかの場所にドラッグ

すると下の画像のようなポップアップが表示される。

Collapsing Toolbarにチェックを入れてOKを押下する。

現段階で実行したのがこちら。
![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704865/339e43e2-7ce9-4

元記事を表示

JUnitでのユニットテストに入門してみた

# はじめに
初めまして、Androidエンジニアのバナナと申します。
Android開発の経験年数はそれなりになるのですが、テストコードを書くことなくここまできてしまったため、今年こそはという思いでテストについてまとめていければと思っています。
Androidテストのバイブルと言われている[Androidテスト全書](https://peaks.cc/books/android_testing)を参考に進めていきます
まずは、JUnitを使って簡単なユニットテストをしていきます。 

# テスト対象クラスの作成
今回は簡単な入力ボックスを想定し、8文字以上の英数字の入力であれば真を返すメソッドを持つクラスを作成していきます。

“`kotlin:InputChecker.kt
class InputChecker {
fun isValid(text: String): Boolean {
if (TextUtils.isEmpty(text)) throw IllegalArgumentException(“Cannot be blank”)

元記事を表示

【Android】ViewPager2を簡単に作ってみる

## はじめに
よくチュートリアル画面などの実装に使われるViewPager2。
早速実装してみようと思い色々調べていたのですが、プログラミング初心者ゆえに意外に混乱してしまったため簡単にまとめてみたいと思います。

* 最近Android開発を始めた方
* ViewPager2について調べているけど記事によって書き方が違うので混乱してきた方

などの参考になればとても嬉しいです。
もしも間違いなどあればご指摘いただけますと幸いです。

## 実装内容
### 完成イメージ
こんな感じの横にスワイプするだけの画面を作ります。

* ページは2ページ
* 無限スワイプはしない

### 作成ファイル
* “` MainActivity.kt“` / “`activity_main.xml“`

元記事を表示

SearchViewのフォーカスの当て方、外し方

#はじめに

SearchViewは少々クセの強いUIですが、検索窓の実装には比較的使用頻度の高いUIですよね。
画面遷移時にフォーカスを当てたり、外したりすることがたまにあったりしますが、いつも調べている気がしますので、まとめておこうと思います。

#フォーカスの当て方

まず、フォーカスを当てるためには、以下を設定する必要があります。

“`
searchView.requestFocus()
searchView.requestFocusFromTouch()
“`

上記を設定することでフォーカスを当てることができます。
ただし、キーボードは立ち上がりません。

キーボードも合わせて立ち上げる必要がある場合は以下を設定する必要があります。

“`
searchView.setOnQueryTextFocusChangeListener { v, _ -> v?.showKeyboard() }
“`

SearchViewはフォーカスが当たったのを待ってからキーボードを表示する処理を実行しないとキーボードが立ち上がらない、といった罠があります。
この点注意が必要です。

元記事を表示

BottomSheetDialogFragmentでJetpack Composeを使う

既存プロジェクトの一部画面をJetpack Compose化していくなかで、BottomSheetDialogFragmentをJetpack Compose化しました。
その際にBottomSheetDialogFragmentのスクロールの処理と、Jetpack ComposeのLazyColumnのスクロールがいい感じに動作しなかったため大苦戦しました。なんとか解決できたのでご紹介します。

ちなみにですが、ボトムシート自体をJetpack Compose化したのではなく、BottomSheetDialogFragmentのまま、レイアウトファイルをJetpack Composeリプレースした感じです。

この記事で実装したサンプルコートも公開しています。

https://github.com/yasukotelin/BottomSheetDialogFragmentWithJetpackCompose

## 普通に実装してみた

まず、普通にレイアウトファイルをJetpack Compose化してみます。ボタンが8つあるちょっと縦に長いボトムシートのイメージです。
Prev

元記事を表示

[Android] flowWithLifecycleを使う際気をつけたいこと

# Lifecycle-awareなFlowの収集
ActivityやFragmentでFlowを収集する際、ライフサイクルに適した動作をする`Lifecycle.repeatOnLifecycle`の利用が[推奨されています](https://developer.android.com/kotlin/flow/stateflow-and-sharedflow?hl=ja#stateflow)。
通常の`LifecycleScope.launchWhen`ではアプリがバックグラウンドにある状態など、ビューが表示されていない場合でもイベントが処理されるためです。

“`kotlin
class LatestNewsActivity : AppCompatActivity() {
private val latestNewsViewModel = // getViewModel()

override fun onCreate(savedInstanceState: Bundle?) {

// Start a coroutine i

元記事を表示

API返却物の日付用Deserializer

#最初に
今回は、APIの返却物でよくある日付を変換してくれるDeserializerを備忘録として残しておきます。

###コード

“`kotlin:
@ExperimentalSerializationApi
@Serializer(forClass = ZonedDateTime::class)
object ZonedDateTimeSerializer : KSerializer {
private val formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME

override fun deserialize(decoder: Decoder): ZonedDateTime =
ZonedDateTime.parse(decoder.decodeString(), formatter)

override fun serialize(encoder: Encoder, value: ZonedDateTime) =
encoder.enc

元記事を表示

Android 12でCaused by java.lang.IllegalStateException You need to use a Theme.AppCompat theme (or descendant) with this activity.

# 概要
AndroidX Core Splashscreenでスプラッシュ画面を作成するとAndroid 12端末で以下のようなクラッシュが発生することがあった。

“`
Caused by java.lang.IllegalStateException You need to use a Theme.AppCompat theme (or descendant) with this activity.
“`

不適切なタイミングで`installSplashScreen` を呼ぶと上記のエラーが発生することがある。

# 対策

件のクラッシュは `開発者向けオプション`で`アクティビティを保持しない`をONにしてアプリをバックグラウンドから起動すると高確率で発生する。

クラッシュの原因は `installSplashScreen` を `super.onCreate` の後に呼んでいたため。

“`MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.o

元記事を表示

OTHERカテゴリの最新記事