Do what you want to do

プログラミングとかとか

RadioButton, RadioGroup を使ってみる

今回はラジオボタンを使ってみます。

開発環境

レイアウト

まずはレイアウト。 ラジオボタンを2つ縦に並べてみました。 RadioButtonRadioGroupの中にいれてやることで 2つのラジオボタンを排他的(どちらか一方のみ選択可能)にできます。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ui.MainActivity">
    <RadioGroup
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/radioGroup" android:layout_marginTop="8dp"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp">
        <RadioButton
                android:text="@string/radiobutton1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/radioButton1"
                app:layout_constraintEnd_toEndOf="@+id/radioGroup"
                android:layout_marginTop="8dp"
                app:layout_constraintTop_toTopOf="@+id/radioGroup"
                app:layout_constraintStart_toStartOf="@+id/radioGroup"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:onClick="onRadioButtonClicked"/>
        <RadioButton
                android:text="@string/radiobutton2"
                android:layout_height="wrap_content"
                android:id="@+id/radioButton2"
                android:layout_width="match_parent"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:layout_marginBottom="8dp"
                android:onClick="onRadioButtonClicked"/>
    </RadioGroup>
</android.support.constraint.ConstraintLayout>

onClickイベントを実装する

レイアウトのxmlandroid:onClick="onRadioButtonClicked"の記述がありますが、ここでActivity側のクリックイベントハンドラーと紐づけています。 Activity側のメソッドがこちらです。

fun onRadioButtonClicked(view: View) {
    if (view is RadioButton) {
        val checked = view.isChecked

        when (view.id) {
            R.id.radioButton1 ->
                if (checked) {
                }
            R.id.radioButton2 ->
                if (checked) {
                }
        }
    }
}

viewのidからどちらのラジオボタンのイベントかどうかを判定しています。

実行結果

radiobutton

参考

CheckBoxを使ってみる

今回はチェックボックスを使ってみます。

開発環境

レイアウト

まずはレイアウト。 チェックボックスを2つ縦に並べてみました。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ui.MainActivity">

    <CheckBox
            android:text="@string/checkbox_receive_email"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/checkBox1" android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="16dp"
            android:onClick="onCheckboxClicked"
            android:layout_marginEnd="16dp" app:layout_constraintEnd_toEndOf="parent"/>
    <CheckBox
            android:text="@string/checkbox_notification"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/checkBox2" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="16dp" android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/checkBox1"
            android:onClick="onCheckboxClicked"
            android:layout_marginEnd="16dp" app:layout_constraintEnd_toEndOf="parent"/>
</android.support.constraint.ConstraintLayout>

onClickイベントを実装する

レイアウトのxmlandroid:onClick="onCheckboxClicked"の記述がありますが、ここでActivity側のクリックイベントハンドラーと紐づけています。 Activity側のメソッドがこちらです。

fun onCheckboxClicked(view: View) {
    if (view is CheckBox) {
        val checked: Boolean = view.isChecked

        when (view.id) {
            R.id.checkBox1 -> {
                if (checked) {
                    // do something
                } else {
                    // do something
                }
            }
            R.id.checkBox2 -> {
                if (checked) {
                    // do something
                } else {
                    // do something
                }
            }
        }
    }
}

上記は1つのメソッドを2つのチェックボックスで共有しているため、viewのidからどちらのチェックボックスのイベントかどうかを判定しています。 複雑になりそうならチェックボックス毎にメソッドを分けたほうがいいかもしれませんね。

実行結果

checkbox

参考

Toastを使ってメッセージを表示する

開発環境

Toastとは

画面の下にちょっとの間表示されるアレです。iOSにはないコンポーネントです。 そういえば最近Toast使ってるアプリ見かけなくなってきた?気のせい?まぁいいか。 今回はToastの表示方法です。とはいっても内容は軽め。

Toastの表示方法

import android.widget.Toast

fun didTapButton(view: View) {
    val message = "Sending message..."
    Toast
        .makeText(applicationContext, message, Toast.LENGTH_LONG)
        .show()
}

これだけ?え?これだけ。本当にこれだけです。 引数に以下を指定します。

  • applicationのContext
  • メッセージ
  • 表示長さ
    • LENGTH_SHORT(短め)もしくは LENGTH_LONG(長め)

実行結果

Toast.LENGTH_SHORT

f:id:katoj:20190328193127g:plain

Toast.LENGTH_LONG

f:id:katoj:20190328193202g:plain

おわりに

簡単に表示できました。 表示位置のカスタマイズ等もできるみたいですが、今日はこの辺で。

[Kotlin] LogクラスのTAGとしてActivityのクラス名を指定する処理をKotlinの拡張関数を使って共通化する

「毎回Activity毎にLogのTAG用変数作るとか面倒すぎじゃない?」

Kotlinなら拡張関数で簡単に共通化できそう... ということでやってみました。

LogクラスのTAGとしてActivityのクラス名を指定したい

「LogクラスのTAGとしてActivityのクラス名を出力する」ということはよくあるやり方だと思います。 JavaでもKotlinでも以前からAndroidではLog クラスを使ってログを出力できます。

Log クラス に載っているTAGの定義(Javaですが)を見てみましょう。

private static final String TAG = "MyActivity";

「いやいや、うーん、文字列入れてるだけじゃん。ってか毎回Activity毎にこれ定義するの?まじ?」

Kotlinの拡張関数を使って共通化

以下のようにKotlinを拡張してログを出力する関数を定義しました。 this::class.java.simpleName を使ってクラス名を取得しています。

import android.app.Activity
import android.util.Log

fun Activity.logd(message: String) {
    Log.d(this::class.java.simpleName, message)
}

使い方

使い方は簡単。Activityから定義したlogd 関数を呼ぶだけです。

fun didTapButton(view: View) {
    logd("user tapped the button.")
}

おわりに

クラス名を取得する処理を1箇所にまとめたことでActivity毎に毎回LogのTAG用変数を定義する必要がなくなりました。 Kotlinの拡張関数便利ですね。

みさきまぐろきっぷを使って城ヶ島を満喫してきた

技術記事は会社ブログの方に書いています

久しぶりのブログ更新です。 相変わらず技術記事は↓会社ブログの方に書いています。

dev.classmethod.jp

みさきまぐろきっぷを使って城ヶ島を満喫してきた

さて、8月20日(水)の有給にみさきまぐろきっぷを使って城ヶ島に行ってきました!

みさきまぐろきっぷとは

京急電鉄が販売している京急線往復とバス乗車券に食事券やレジャー施設利用券 or お土産券がついたお得なきっぷです。 www.keikyu.co.jp

出発は横浜

横浜できっぷを買って10時半くらいに出発しました。 f:id:katoj:20170922124401j:plain

電車に揺られること一時間弱、三崎口駅に到着。ここからは京急バスに乗って城ヶ島に向かいました。 もちろんここまできっぷ以外にお金を使っていません!!

お昼すぎに城ヶ島に到着してお昼

バスに乗って30分くらいで城ヶ島に到着。お腹がペコペコだったのでお昼を食べようとお目当のお店に向かうと….

f:id:katoj:20170922125018j:plain

ふぁっ!?まじかよ!w|;゚ロ゚|w

ってことで別の店を探すことに…

幸い近くにすぐお店が見つかりました。お店はこちら。 retty.me

もちろんまぐろきっぷが使えるお店です。

気前良すぎ!イカ焼きをサービスしてくれた

店内満席だったので10分ぐらい待ってから入店。 店員さんもまぐろきっぷを利用する客に慣れているようで「まぐろきっぷの対象のメニューはなんですか?」と聞くとすぐに「こちらになります」とまぐろてんこ盛り丼とイカ焼きのセットを案内してくれました。

満席だったのでなかなか料理出てこないかなーと思っていたらお店のお母さんが「待たせてごめんねぇ」とイカ焼きをサービスしてくれました。まぁ、もともとイカ焼き付いてるんですけどそれとは別ですw

f:id:katoj:20170922125317j:plain

そしてそこから待つこと5分くらいかな。サービスではないイカが出てきましたw

f:id:katoj:20170922125840j:plain

そしてまぐろてんこ盛りも着丼!

f:id:katoj:20170922125901j:plain

まぐろも米もてんこ盛り!! まぐろはネギトロに赤身やトロの部分もあって美味しかったです(^-^)

まぐろを食べた後は灯台へ

お昼を食べた後は「食べたしちょっと歩かないとなぁ」と思いすぐ近くの灯台へ

f:id:katoj:20170922130409j:plain f:id:katoj:20170922130434j:plain

天気は曇りであまり良くなかったけど気持ちいい海風が吹いてて食後の休憩には良かったです。 f:id:katoj:20170922130528j:plain

オーシャンビューの露天風呂に入って気分は最高

歩いた後は城ヶ島京急ホテルへ。 f:id:katoj:20170922130716j:plain

目的は日帰り入浴!まぐろきっぷのレジャー施設利用券を使って海が見える風呂に入れるのです!!

↓さすがに風呂で写真は撮れないので近くからの海の眺めです。こんな海を風呂に入りながら見れます。 f:id:katoj:20170922130917j:plain

大満足でした

ホテルや商店街でお土産を買って帰路につきました。 3000円弱で交通費、食事代、日帰り入浴もできて大満足な1日となりました。 これからもたまに自分へのご褒美に行こうかな。

2016年を振り返る

今年も残すところあと二日

こんにちは。普段技術系のブログはこちらに書いているので、主にプライベートなことを書いているこのブログのほうは更新が滞ってしまっていました。 もうすぐ2016年も終わりなので今年1年を振り返ってみたいと思います。すいません、箇条書きで、完全自分メモです。

仕事

  • メインの業務は変わらずiOSアプリの開発。
  • 10月でクラスメソッドに入社して1年経ったので2年目に突入。
  • 昨年は保守案件のみだったが今年は新規案件に要件定義~開発~リリースまで微力ながら携わった。その分大変さもあった。
  • 9月は1カ月間育休取った。手続きは多少面倒だが、育児休業給付金がすごく助かった。

プライベート

  • 長女が生まれた。マジかわいい。
  • 子供が生まれたことで、仕事とプライベートのバランスについてより考えるようになった。
  • 子供が生まれてから週1ペースでリモートワークをするようになった。

ブログ

  • 今年はDevelopers.IOのブログを36本(月平均3本)書いた。 育休もあったわりにはまぁまぁ頑張ったと思う。

2017年はどうするか

2017年は特に具体的に目標は定めず、来るものは拒まず、歩んでいければと考えています。 技術的には最近はXamarin熱が高まりつつあるので学んだ事をどんどんアウトプットしていければと考えています。 プライベートでは子供の成長が楽しみです。

それでは、どうぞ来年もよろしくお願いいたします。

育休生活を1週間送ってみて

9月1日から1ヶ月間会社に育休もらって只今子育ての真っ最中です。 9月4日から妻と子供との3人暮らしがスタート。1週間経ったので思うところを記録に残しておきたい。

全てが子供中心の生活

当たり前ですが、赤ちゃんは言葉を喋れません。できるのは泣くことのみです。お腹が空いた、オムツを替えてほしい、服がゴワゴワしてて気持ち悪いなど、泣く理由は様々ですがとにかく泣くことで意思を示します。 そして2〜3時間おきに母乳(ミルク)を与えなくてはいけません。 昼間だろうが夜中だろうが赤ちゃんには関係の無いことです。 普通のサラリーマンは夜勤など特別な勤務では無い限り昼間に起きて働き、夜になったら寝ますよね。 ですが、赤ちゃんは昼間だろうが夜中だろうが関係無いのでこの生活リズムは乱れます。間違いなく寝不足になります。許容しましょう。

赤ちゃんは理由もなく泣くことがある

これは子育てを始めてみてわかったのですが、赤ちゃんは理由もなく泣くことがあるそうです。 親としては「お腹が空いたのだろうか?」、「オムツを替えて欲しいのだろうか?」、「どこか痛いところがあるのだろうか?」など色々考え、一通り確認するのですが何も問題無し。 でもずっと泣いている。「泣くには泣く理由があるはずだ」「その泣く理由を取り除いてあげれば泣きやむはずだ」と思っているといっこうに泣き止まないと不安や焦りが出てきてツライです。 一通り確認しても泣く理由が無い場合は「グズっているだけだ」と楽観的に考え、抱っこ等であやしましょう。グズって泣いているだけならいずれは泣き止むはずです。

男性に女性の代わりはできない

育休を取るような男性の場合、育児にそれなりに積極的な人が多いと思います。 積極的なのはもちろん素晴らしいのですが、女性が育児に関してできることは全て男性でもできると思わないことが重要です。 母乳をあげることは(母乳という言葉通りですが...)男性にはできません。 つまり母乳を求めて赤ちゃんが泣いている時だけは男はどうしようもないのです。 せいぜいミルクを作ってあげることくらいはできますが、栄養面を考えてもなるべく母乳を飲ませて育てたいですよね。 男には無理だと割り切り女性にお願いしましょう。

男性はできることを

母乳をあげることは男性にはできないですが、他の事はできます。 お風呂に入れる、ミルクをあげるなど育児に直接関することもありますし、 料理、洗濯、掃除などの家事もできます。 後者は育児に直接的な関わりは無いですが、女性の負担を減らすことができるはずです。できることはやりましょう。

育休生活は始まったばかり

体力的にはキツく、始めてのことも多く戸惑いもありますが、子供の顔を見ると癒されます。 楽しい生活はこれからも続きます。