Yumemiのコードチェックをやってみた

Yumemi社のコーディングチェックをやってみようと思ってやり始めたら、思いの外興が乗ってしまった。

コーディングチェック最初は真面目に取り組もうとしていたのだけど、途中から方針ががらりと変わって自分の学習用の場になってしまった。

始めてから大体1週間位経ったので現在の経過を書いておこうと思う。

Read full post gblog_arrow_right

Modifierの適用順序、難しすぎん?

最近になってようやくJetpack Composeを触り始めた。

はじめはとっつきにくいなあ、レイアウトはXMLでいいじゃんとか思っていたのだが、慣れてしまえば不思議なものである。レイアウト見るためにいちいちXMLファイル見に行くほうが面倒くさいじゃんと今では感じるようになった。

しかしJetpack Composeでもよくわからないことがある。それがModifierである。

Read full post gblog_arrow_right

Fragmentで初期化処理を行うのはどこでやるのか

Fragmentでの初期化処理を行う場所どこだっけとなったので備忘録として残しておく。

処理する場所が変わったんだな、ということだけは記憶にあったのだが、結局どこになったのだったかなと迷ってしまった。この先何回も遭遇しそうだったので、ブログに残しておこうと思う。

Read full post gblog_arrow_right

FragmentFactoryを使ってコンストラクタ経由でFragmentに値を渡す

Fragmentに値を渡す場合は、Bundle経由で渡すのが常識だった。Fragmentはシステムで生成されるため、引数付きのコンストラクタが認識されなかったからだ。

しかし最近ではFragmentFactoryを使うことで、Fragmentに引数付きのコンストラクタを定義しても大丈夫になったということで、今回試してみることにした。

Read full post gblog_arrow_right

OkHttpを使ってAndroidでネットワークリクエストを行う

Android端末でネットワークリクエストを行う方法について書いてみる。APIを叩く=Retrofitを使うという図式があるのだが、まずその前段階としてOkHttpを使ってネットワークリクエストをしてみようと思う。

Androidでネットワークアクセスする記事ってあんまりないかもって思ったので書いてみることにした。ついでにいうとリハビリを兼ねてというのと、自分でも振り返ってみるとどうやるんだっけってなったのがきっかけである。

Read full post gblog_arrow_right

RecyclerViewのマルチセレクションをActionModeと一緒に利用する(途中経過)

あまりにAndroidネタを書いていないので、たまにはAndroidの話を書こうと思う。

RecyclerViewのアイテムを任意で複数選択し、その選択したアイテムに対して何らかのアクションを実行するのを試してみている。自分のアプリに組み込もうと思ったのだが、いきなり導入するにはAndroid Developersの情報では一体どうしたらいいのかさっぱりわからなかった。

こういうときは専用プロジェクトを作って使い方を試すのが私のやり方。サンプルプロジェクトを作ったのでその話を書こうと思う。

ちなみにこの記事ではコードの話は一切ない。とりあえずそれっぽく動くが、未だに動きに納得できていないし、やっぱり理解しきれていないのが大きい。

Read full post gblog_arrow_right

TouchDelegateを使ってタッチ可能領域を拡張する

Buttonのクリックに反応する範囲を拡張したい時がある。 今回は下図のようなカスタムViewを作りたかった。

Image

ImageButtonとTextViewを内包したViewである。 親レイアウトのViewGroupをタッチする=ImageButtonをタッチするという扱いにしたかった。

ImageButtonにしているのは、他のViewとの兼ね合いである。 他のViewはImageButtonにstyle="@style/Base.Widget.AppCompat.ActionButton"を適用して、アイコン画像の周りにだけリップルエフェクトがかかるようになっていて、このカスタムViewもそれに合わせたかったのである。

これはTouchDelegateを使うと実現できる。

TouchDelegate – Android Developers

使い方

TouchDelegateは親のViewGroupに設定する。

TouchDelegateのインスタンスを作成するには、タッチエリアを表すRectと委譲先のView(今回でいうとImageButton)への参照が必要。 Rectはローカル座標系(ディスプレイ上での絶対座標ではなく、ViewGroupの左上を0とした相対座標)を使う。 今回はViewGroupのgetDrawingRect()を使って取得したRectを使った。

ぐぐるとgetHitRect()を使った例がみつかったが、これだとうまく動かなかった。絶対座標になっているからだと思われる。

コード例

class CommentStatusView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {

    private lateinit var binding: ViewCommentStatusBinding

    init {
        binding = ViewCommentStatusBinding.inflate(LayoutInflater.from(context), this, true)
        doOnPreDraw {
            val rect = Rect()
            binding.viewGroup.getDrawingRect(rect)
            binding.viewGroup.touchDelegate = TouchDelegate(rect, binding.imageButton)
        }
    }

    override fun setOnClickListener(l: OnClickListener?) {
        binding.imageButton.setOnClickListener(l)
    }

}

Kotlinで、Android-ktxとDataBindingを使っている。

doOnPreDrawがAndroid-ktxを使っている部分で、ViewTreeObserverを利用してViewの大きさが決まった後で中のブロックの処理(TouchDelegateの設定)を行っているだけである。

後はこのカスタムViewに対するsetOnClicklistenerをImageButtonに対して設定するようにしている。

ポイントは

Read full post gblog_arrow_right