前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Tips

Jetpack Compose:特定の条件のときだけClickableにしたい

内容 あるコンポーサブルをにclickable属性を付与したいが、条件によってはoffにしたい。 クリックイベントを空 {}にしてもタップエフェクトが発生してしまう。どうすればよいか。 対応 Modifier.clicable()のenabled パラメータを使う @Composable fun Some…

Duplicate class対応:Google Play Coreライブラリの分割

内容 androidx.navigation関連のライブラリを2.6.0にあげたところDuplicate classエラーが発生した。 > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable > Duplicate class com.google.android.play.c…

PagingDataのテストデータを作成する

内容 Jetpack ComposeでPagingライブラリのレスポンスであるFlowを使ったComposableを Preview、テストしたい。どうすればよいか。 対応 Version 3.0.0-alpha04 から PagingData.from(List<T>) が使えるようになったのでこれを使う。 // 本の一覧があるとする v</t>…

Iconコンポーサブルをtintを指定せずに使いたい

内容 アイコンのSVGデータなのでIconコンポーサブルを使って表示したいが、SVGデータが2色以上になっていて、 Iconコンポーサブルを使うと1色になってしまい、正しく表示されない。どうすればよいか。 対応 tint(色付) をColor.Unspecified (不特定)にす…

Jetpack Compose:TextのmaxLines指定時に表示した文字列と隠れた文字列を知るには

内容 コンテンツをリスト表示する際に、記事などの長文を部分表示したい場合に maxLinesパラメータを使って表示を制限するが、現在どこまで文字列が表示されているかを知りたい。どうすればよいか。 対応 TextViewの場合にはTextUtils.ellipsize() という関…

Android : Compose : TextStyleを効率的に定義する

課題 TextStyleを使って文字コードやフォントサイズ、色などを指定できるが、画面ごとに微妙に変わることがあり、その度にスタイルを作っていくと数が増え過ぎてしまう。どうすればよいか。 回答 TextStyle.copy()を使おう。 実践例 メインで使うテキストカ…

Android: Fragment内のComposeでスクロール位置を復元する

追記 新しい記事を書いたのでこちらをご参考ください。 takerpg.hatenablog.jp 内容 Fragment内に ComposeVIew を作成し、LazyColumn でリストを表示したが、画面遷移から戻るとスクロール位置が元に戻ってしまう。 どうすればよいか。 TODO まず、ComposeVi…

Android: LazyColumn(LazyVerticalGrid)にヘッダー、フッターを表示する

内容 LazyColumnで一覧を表示する際にローディングのフッターを表示したい。どうすればよいか。 対応 LazyColumn、LazyVerticalGridなどで一覧を表示する場合、通常は各Scope関数であるitemsに一覧データを渡してアイテムごとに処理を行うが、単にLazyColumn…

Android: LazyVerticalGridでPaging3を使えるようにする

追記 https://developer.android.com/jetpack/androidx/releases/paging#1.0.0-alpha19 1.0.0-alpha19ですべてのLazyLayoutに対して利用可能な低レベルの拡張メソッドが提供されるようになっため、以下の対応はすでに不要となっている。 内容 LazyVerticalGr…

Jetpack Compose : TextFieldにdisabledTextColorを適用するには

内容 TextFieldをdisabledな状態にしたい。どうすればよいか。 対応 enabledパラメータをfalseにする。基本はこれだけで、フォーカスが当たらなくなり、編集不可になる。 // 抜粋 TextField( enabled = false ) 色が変わるようにする enabled=falseになった…

Apple Silicon版のAndroid StudioをToolbox Appで使えるようにする

課題 Apple Silicon版のMacBook Proの購入に伴い、Android StudioもApple Silicon版にしたいが、 できればJetBrainsのToolbox App経由で使いたい。どうすれば良いか。 対応 JetBrains Toolbox AppをApple Silicon版にする Toolbox上のAndroid Studioをアンイ…

Android:SVGでシンプルな図形を描く方法を知っておく

内容 ベクター画像をデザイナーさんからもらって使っているけれど、ちょっとしたものは自分で書いて済ませてしまいたい。そんな時に。 四角形 <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> </vector>

Android:BottomNavigationViewに独自の画像をセットする

課題 マテリアルコンポーネントのBottomNavigationViewを使いたいが、一部のアイコンだけログインユーザーの画像にしたところ、すべてのタブに自動的にColorListが適用されてしまい画像が表示されない。どうすればよいか。 対応 BottomNavigationViewはタブ…

Android:既存アプリにMaterial Components Themeを段階的に適用する

課題 既存アプリでMaterial Components 対応をするため、テーマを適用してみた。 <style name="AppTheme" parent="Theme.MaterialComponents.Light" /> <style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.Light.NoActionBar" /> すると、ボタンやテキストボックスの色がまとめて違うものになってしまった。 全部を個別に対応するのは大変なので段階的に対応したい。どうすればよいか。 対応 Theme.Mate…

Android Studio:Code Completionで大文字小文字を無視する

課題 Android Studioでコード補完(Code Completion)する際に大文字小文字が一致していないと補完してくれなくなった。どうすればよいか。 対応 Preferences -> Editor -> General -> Code completion -> Match Case をオフにする Match caseのチェックを外…

Android: Paging3:PagingAdapterのデータを空にする

課題 Paging3でデータをセットしたはいいが空にしたいときにはどうすればいいか。 データを空にする PagingData.empty() をsubmitDataに渡してあげればよい。 adapter?.submitData(lifecycle, PagingData.empty()) 参考 stackoverflow.com

Jetpack Compose:アイコン付きテキストを作る

試行錯誤の記録。慣れるまでが一苦労。Android Studioのレイアウトエディターとか完全に無用の長物になってしまったな。 アイコン付きテキスト 左にアイコンがあってテキストが続くようなよくあるケース @Composable fun TextWithIcon() { Row(verticalAlign…

Retrofit:responseBodyがnullのsuspend関数を定義する

課題 Retrofit2でレスポンスが空のsuspend関数を定義したい場合、以下の書き方だとエラーになる。 suspend fun like( itemId:Int ) :Unit // 単にCallを外しただけだとNG。Void, Unit?も同様 <クラス名> was null but response body type was declared as no…

suspend関数を処理可能なラムダパラメータを定義する

タイトルも本文も何言ってるか分からないかもしれないけれどちょっと感動したので。 課題 ViewModel内の関数で、コルーチン内部でラムダを実行させたい。 このラムダは内部でRetrofitによるsuspend関数のAPI呼び出しを行うためsuspend関数の実行が必要である…

Android: BundleにEnumをセットする

課題 画面間の値渡しでBundleにEnumの値をセット、取得したい。どうすればよいか。 対応 EnumはSerializableなので Bundleの putSerializable メソッドが使える。 enum class Mark { HEART, SPADE, DIAMOND, CLUB } fun newInstance(): CardFragment { retur…

Android: ViewBindingでViewHolderの記述をシンプルにする

課題 これまでButterKnifeを使ってFragment及びViewHolderのView操作を記述してきたが、ViewBinding登場に伴いButterKnifeはdeprecatedになった。 ViewHolderをViewBindingを使って書き換えたいが、どうすればよいか。 対応 user.xmlとかいうユーザー一覧の…

Android: LiveDataでオブジェクトのプロパティの変更を監視する

課題 UserをViewModelにLiveDataとして設定したが、Userオブジェクトのプロパティの変更を知りたい。どうすればよいか。 対応 LiveDataはvalueに値が代入されたタイミングでないとObserverに伝えてくれない。 参考サイトにはいくつかの対応案があるが、LiveD…

メアド、パスワードの入力候補を無効化したい

課題 Androidの8.0からAutofill機能が追加され、メアドとパスワードを記憶、自動セットしてくれるようになったが、 新規入力画面ではメールアドレス、パスワードの保管を無効化したい。どうすればよいか。 対応 importantForAutofill を no にする <TextView android:importantForAutofill="no" /> 逆に yes</textview>…

dpに対応する実際のピクセルサイズを得る

課題 指定したdpサイズに対応する、端末の解像度に応じた実際のピクセルサイズが知りたい。 対応 dimens.xmlを使う。 <resources> <dimen name="user_icon">40dp</dimen> </resources> var size = context.resources.getDimensionPixelSize(R.dimen.user_icon) 関連 takerpg.hatenablog.jp

ScrollViewのスクロール位置の再現

注意 この記事は何らかの(失念)実装ミスをした際に発生した副作用に対する誤った解決策であり、 この処理が必要になるのは別なところに記述ミスがある可能性が高いと思う。 基本的に戻るボタンで戻った際にスクロール位置の再現が必要になることはないと思…

CoordinatorLayoutとViewPagerの共存

課題 あるViewの下にViewPagerがある。ViewPager内のリストをスクロールした際に、その上のViewもスクロールさせたい。 対策 CoordinatorLayoutとAppBarLayoutと合わせて使う。

RecyclerViewにフッターを表示する

課題 RecyclerViewの追加読み込み時にフッターを表示したい。 対策 リストの最後尾にFooter用のオブジェクトを追加し、ViewTypeで判別して出し分け。追加データ取得時に削除する。エレガントな方法ではないけれど、とりあえず思いつく簡単な方法。 任意の型…

RecyclerViewにオートスクロール機能をつける

課題 RecyclerViewでもオートスクロールを実現したい 対策 RecyclerView#addOnScrollListenerとLinearLayoutManager#findLastVisibleItemPositionを組み合わせる。LinearLayoutManagerにはfindLastVisibleItemPositionという一部が見えている最後のアイテム…

ActionBarにロゴを表示する。

課題 AppCompatActivityに変更したところ、ActionBarに表示していたロゴが表示されなくなった。どうすればよいか。 対策 ActionBarに対してロゴ出力設定を有効化する。 ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); i…

ひらがなをカタカナに変換する。

課題 ひらがなで入力された文字列をカタカナに変換したい。 対応 1文字ごとにひらがなかどうかを判定し、文字コードをカタカナの位置までずらす。ひらがな判定に固定値でユニコード範囲を使用してもいいのだけど、 UnicodeBlockにHIRAGANAが定義されているの…