初めてのkotlin

kotlinによるAndroidアプリ開発での気付き

kotlin

正規表現

ここでは正規表現の文法については扱いません。 Regexのメソッドの使い方にいつも悩むので、 その覚書としてのメモになります。 perlの正規表現は、$str=~ /abc/と書きさえすれば、 正規表現を活用するあらゆる処理が可能となりますが、 kotlinだとなかなか…

拡張子の取り除き方

androidではあまり使う機会はないかもしれませんが、 応用できるので、使用経験があまりない方も知っておいて損はないかと思います。 拡張子を取り除く方法について、 ネットを調べると、splitやlastIndexOfを用いた方法がたくさんヒットするのですが、 これ…

java.langなどjava系のクラスが利用できない

今回、バッチプログラムを書くにあたり、 せっかくなのでバッチでもkotlinを使ってみようと、 IntelliJ IDEAでkotlinのプロジェクトを作ってみたら、 タイトルのとおり、何故かjava.~に由来するクラスが一切使えない状態でした。 build.gradleファイルを触…

バナー広告を設置する

Androidアプリを作れば、やはり収益に結びつけたくなるのが人情。 と言うわけで、バナー広告を設置します。 但し、ここではサンプルIDを用いて広告が表示されるのを確認するまでとします。 実際にアプリを公開する際には、 自身でIDを発行し、それに差し替え…

キーボードを隠す

EditTextにフォーカスを当てるとソフトウェアキーボードが表示されます。 でも、そのキーボードは、入力が完了しても表示されたままなのですよね。 で、ネットで調べるとonFocusChangedイベントで非表示にすればいいと書かれたものが多いのですが、 フォーカ…

リソースが見えなくなったら

Javaのコードをkotlinに変換した時によく遭遇するのですが、 リソースデータが見えなくなることがあります。 そんな時は、おかしなファイルがimportされていないかどうかをチェックしてください import android.R この行を消せば直ります。

ディスプレイ周りの各種サイズの取得

ステータスバーやナビゲーションバーなど、 画面関係のサイズや座標を取得します。 activity引数には、Activityから呼び出す時はthisを指定すればOKです。 ディスプレイサイズの取得 fun getRealDisplaySize(activity: Activity): Point { val outSize = Poi…

オプションメニューにボタンを付ける

オプションメニューに、チェックボックスとラジオボタンを付けます。 また、ラジオボタンはサブメニュー化します。 注意点としては、選択状態の切替えは、自分でプログラムを書くこと。 何も書かないと、クリックしても選択状態にはなりません。 res\menu\me…

オプションメニューを設置する

アプリバーとかアクションバー、ツールバーなどと呼ばれるタイトルバー部分に、 オプションメニューを付ける方法です。 まずは、リソースデータから。 res\menu\menu_main.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> </menu>

Error inflating class

コンパイルは通るのに、実行時に落ちる。 java.lang.RuntimeException: Unable to start activity ~: Binary XML file line ~: Error inflating class ~ デバッガで確認してみると、リソースが原因で落ちている模様。 ネットで調べてみると、リソースがみ…

イベントリスナの書き方でthisの意味が変わる

kotlinでは、SAM変換を利用してシンプルな形でイベントリスナを記述できますが、 正規の書き方で書いた時とシンプルな形で書いた時で、 thisが違うものを指します。 今回、イベント内でthisを使う必要が出て、気付きました。 kotlin流 button.setOnClickList…

クラスの書き方

カスタムViewの書き方 class CustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : RelativeLayout(context, attrs, defStyleAttr) { ・・・ init { ・・・ } } 上記サンプルはRelativeLayout…

イベントリスナ(コールバック)の書き方

Java風の書き方もできますが、 interface OnSampleListner { fun onSample(int: Int) } class Sample { var sampleListner: OnSampleListner? = null fun sampleMethod() { sampleListner?.onSample(1) } } fun main() { val sample1 = Sample() sample1.sam…

親クラス内の処理から呼ばれた継承可能なメソッドは、どれが動くのか?

多分、知ってる人は知ってるごく当たり前な話なのだとは思いますが、 私は知らなかったので、実験です。 親クラス内から呼び出された継承可能なメソッドは、 子クラスから呼び出された時に、 オーバーライドされたメソッドが動くのか?と言う実験です。 つい…

90%の機能が共通のViewはどのように継承すべきか?

ここに機能の90%が共通のViewが2種類あります。 これらのViewは、以下のように5パターンの作り方があるかと思います。 1.それぞれ別に作る 2.一方のViewをもう一方が継承する 3.共通機能部分でBaseになるViewを作り、それぞれがBaseを継承する 4.抽象ク…

演算子のオーバーロード

Operator overloading Javaは演算子のオーバーロードができないそうですが、 kotlinはできるようです。 なので、昨日UPしたMyDateクラスに早速実装してみましたヾ(´∀`)ノ 計算式によって、日付を加算したり差分(期間)を求めたりできるようになりました。 …

独自の日付クラス

kotlinで日付を扱おうと検索したところ、 LocalDateを使うとのことでしたが、 これを使うと @RequiresApi(Build.VERSION_CODES.O) と言うアノテーションを入れろと言われました。 調べてみると、Android 8.0 Oreo (API Level 2.6)以降でしか動かないことの宣…

initブロックは一番下に書く

kotlin流の書き方では、 プログラムでクラスを初期化する際には、 initブロックに書くようです。 ただ、 このinitブロックの実行タイミングが変数の初期化と同様書かれた順であることから、 変数の宣言より上に書かれていると、 初期化される前に参照するこ…