パルカワ2

最近はFlutterをやっています

アドバイスかと思ったら呪いだった。を読んだ

たまにはこういうの読んでみるかと思ってよんだ。
こういうこと言われることないなと思いながら読んでたんだけど、言われても気にしないか忘れてるだけかもしれない。自分も言ってる可能性あるので気をつけよう。

この本は基本的にクソなアドバイス(クソバイス)をされた人がこういうこと言われました!と説明し、それに対して著者が答えていくみたいな感じなんだけど、クソバイスされた人がクソバイスをした人をお局独身ババアみたいな感じで若干の悪意ありで説明してて???ってなってたけど、ちゃんとコラムみたいなので著者が「同じステージまで落ちたらあかんで」と諭していてそのとおりだなと思った。

文化人類学入門を読んだ

文化人類学入門 (中公新書 (560))

文化人類学入門 (中公新書 (560))

人間の特色は言語をもつことらしい。言語があるので別の人間に自分の体験を伝えることができる。
だからこそ、ここまで人間が発展してこれたのかなあと思った。

そろそろ進化して言語化じゃなくてなんかシュッと伝わるようになってほしいと思ったが、若者が「マ?」とかいうのも少ない労力で自分の考えてることを伝えるコミュニケーションの進化なのでは?と思うなどした。(退化とも言える??)

KotlinのParcelizeとParceler

画面遷移に使えるかなーと思って触ってみたのでメモ
Parcelerはシングルトンじゃないとだめぽ

object MenuParceler : Parceler<MenuOuterClass.Menu> {
    override fun create(parcel: Parcel): MenuOuterClass.Menu {
        val byteArray = ByteArray(parcel.readInt())
        parcel.readByteArray(byteArray)

        return MenuOuterClass.Menu.parseFrom(byteArray)
    }

    override fun MenuOuterClass.Menu.write(parcel: Parcel, flags: Int) {
        val byteArray = toByteArray()
        parcel.writeInt(byteArray.size)
        parcel.writeByteArray(byteArray)
    }

}

class MenuDetailActivity {
    @Parcelize
    data class Extras(
            @TypeParceler<MenuOuterClass.Menu, MenuParceler>()
            val menu: MenuOuterClass.Menu,
            val recipeIndex: Int = 0) : Parcelable

    private val extras: Extras by lazy {
        intent.extras!!.getParcelable(this::extras.name) as Extras
    }

    companion object {
        fun newIntent(context: Context?, extras: Extras): Intent {
            val intent = Intent(context, MenuDetailActivity::class.java)
            intent.putExtra(MenuDetailActivity::extras.name, extras)

            return intent
        }
    }
}

新しい冷蔵庫を買った

  • 現在の家の状況など
  • 日立
    • 野菜の持ちがよい
    • 野菜を買うことが多いので、一番候補
    • 候補は、幅的にSシリーズ
    • まんなか野菜タイプの候補は機能的には、あまりつよくない
    • R-S27JVは、関節冷却カバーがないため候補から外す
    • 奥行きが一番小さいのは、R-S32JVである
    • R-S38JVは、奥行きも高さも一番大きく、かつ容量も375LでR-S4000Hより低いので候補から外す
    • R-S4000Hは、冷凍速度、チルドルーム、自動製氷、野菜室の性能、省エネ技術が強い
    • しかし、R-S4000Hは183cm以上ありレンジを乗せるのはかなりきつい
    • レンジを乗せるのは、R-S32JV(177cm)でも厳しめだと思われる
    • 製氷皿があらえないのなかなかつらい
  • パナソニック
  • 三菱
  • 実際に店舗に見に来た
    • 180cm以上あるのはかなり背が高いので候補から外した
    • お目当てのパーシャル搭載 冷蔵庫 NR-F453HPX | 冷蔵庫 | Panasonic がタイムセール
    • 9月に新しいのが出るからセール
    • 店員に話を聞いたら500Lのほうはもう売り出し中とのこと
    • 500Lの値段は今35万
    • タイムセールしてた(450L)のは17万だったので2倍か〜〜〜ってでかい声で言っちゃった
    • さっきのお客さんには29万まで下げたんですけど、ここまで下げますと26万提示
    • それでもたけーわと思って、なるほど〜って言ってたら25万まで下がった
    • よく考えたら背の低い450Lのほうがほしいんだよなーと思って、 パーシャル搭載 冷蔵庫 NR-F454HPX | 冷蔵庫 | Panasonic はどうですかと切り出したらポイント10%還元+持ってるポイントで払うことを考えると大体20万でお得じゃんと思って購入を決めた(購入時, 価格.comで見ると最安値25万超え)
    • 無理言って9/1午前配送の予定にしてもらったんだけど、そもそもの販売が遅れているようで結局9/20になった

お金がなくなったので豆腐生活が始まります。

BottomNavigationViewのタイトルを常に表示したい

前提

どうやる

追記XMLで指定出来る方法を見つけた。

これで、ラベルが常に表示される。やったね!

    <android.support.design.widget.BottomNavigationView
        ...
        app:labelVisibilityMode="labeled"
        ...>

以下の内容は、動作しますが適切とは言えません。






@SuppressLint("RestrictedApi")
private fun disableBottomNavigationShiftMode() {
    val menuView = navigation.getChildAt(0) as BottomNavigationMenuView
    for (i in 0 until menuView.childCount) {
        val item = menuView.getChildAt(i) as BottomNavigationItemView
        item.setShifting(false)
    }
    menuView.labelVisibilityMode = 1
}

@SuppressLint("RestrictedApi")する必要がありヤダな〜というのが本音だけどまあしょうがない

考えたこと

BottomNavigationItemViewにsetShifting というメソッドがあるので、それをfalseに指定する。
これだけだとタブを切り替えたときにタイトルが消えてしまうため、BottomNavigationMenuViewのprivate APIである isShifting が falseを返すようにする必要がある。
(タブを切り替えるたび、BottomNavigationMenuViewのupdateMenuViewメソッドでViewの更新が行われている)

isShiftingは以下のようなロジックであるので、menuView.labelVisibilityMode = 1と指定するとfalseを返すようになる

    private boolean isShifting(int labelVisibilityMode, int childCount) {
        return labelVisibilityMode == -1 ? childCount > 3 : labelVisibilityMode == 0;
    }

ちなみに 1 ではなく 100 とかを指定しても多分動くんだけど、 BottomNavigationItemViewのsetCheckedlabelVisibilityModeが使われているので変な値を入れるのは避けたほうがよいと思う。
setViewValues の最後の引数が 0, 4, 8 となっているが、これは View.VISIBLEと対応していて、0はVISIBLE, 4はINVISIBLE, 8はGONEとなる。
定数を使わない理由はよくわからない。

    public void setChecked(boolean checked) {
        // 略
        switch(this.labelVisibilityMode) {
        case -1:
            if (this.isShifting) {
                if (checked) {
                    this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                    this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
                } else {
                    this.setViewLayoutParams(this.icon, this.defaultMargin, 17);
                    this.setViewValues(this.largeLabel, 0.5F, 0.5F, 4);
                }

                this.smallLabel.setVisibility(4);
            } else if (checked) {
                this.setViewLayoutParams(this.icon, (int)((float)this.defaultMargin + this.shiftAmount), 49);
                this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
                this.setViewValues(this.smallLabel, this.scaleUpFactor, this.scaleUpFactor, 4);
            } else {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                this.setViewValues(this.largeLabel, this.scaleDownFactor, this.scaleDownFactor, 4);
                this.setViewValues(this.smallLabel, 1.0F, 1.0F, 0);
            }
            break;
        case 0:
            if (checked) {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
            } else {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 17);
                this.setViewValues(this.largeLabel, 0.5F, 0.5F, 4);
            }

            this.smallLabel.setVisibility(4);
            break;
        case 1:
            if (checked) {
                this.setViewLayoutParams(this.icon, (int)((float)this.defaultMargin + this.shiftAmount), 49);
                this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
                this.setViewValues(this.smallLabel, this.scaleUpFactor, this.scaleUpFactor, 4);
            } else {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                this.setViewValues(this.largeLabel, this.scaleDownFactor, this.scaleDownFactor, 4);
                this.setViewValues(this.smallLabel, 1.0F, 1.0F, 0);
            }
            break;
        case 2:
            this.setViewLayoutParams(this.icon, this.defaultMargin, 17);
            this.largeLabel.setVisibility(8);
            this.smallLabel.setVisibility(8);
        }
        // 略
    }

京都行った








1日目おわり。涼しかった






2日目おわり。Kyoto.なんか で話した。久しぶりに話したけど、みんながいい感じに反応してくれたのでかなり話しやすかった。ありがとうございます






















川に行って、財布を落とした(メガネは見つかりました)
追記: 財布見つかりました

MainActivityがあるのに見つからないと言われる

特定の端末にだけビルド後インストールが出来なくて困っていた。

  • 端末には、仕事用プロファイルと個人用プロファイルがあった
  • 開発中のアプリが両方のプロファイルにインストールされていた
  • 個人用プロファイルから開発中のアプリをアンインストール
  • 仕事用プロファイルには開発中のアプリが残ったまま
  • ビルド後インストールしても立ち上げるときに Activity class {....MainActivity} does not exist. と言われる
  • 仕事用プロファイルから開発中のアプリをアンインストールすると起動出来るようになった

仕事用プロファイルのアプリはオフにしてるのにインストールされてしまい不便