Upgrade to Pro — share decks privately, control downloads, hide ads and more …

決戦Kotlinコンバート

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 決戦Kotlinコンバート

Javaで書いてた人間が急にKotlinでコンバートした際のハマった事集です。

Avatar for Takuya Ohashi

Takuya Ohashi

May 07, 2018
Tweet

More Decks by Takuya Ohashi

Other Decks in Technology

Transcript

  1. Icepickをandroid-stateに置き換え @Override public void onCreate(Bundle savedInstanceState) { Icepick.restoreInstanceState(this, savedInstanceState); }

    @Override public void onSaveInstanceState(Bundle outState) { Icepick.saveInstanceState(this, outState); } Before
  2. Icepickをandroid-stateに置き換え override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun

    onSaveInstanceState(outState: Bundle?) { StateSaver.saveInstanceState(this, outState); } After
  3. 例えばこんなの val myTextView: TextView by lazy{ findViewById(R.id.my_text)} 参考:https://qiita.com/takahirom/items/49e18ec7084bb3b1937e 遅延初期化で利用できます。 が・・・。

    バックスタックで戻った際やTabLayoutなどで開きなおした後に値を差し変 たいのに見た目が変わらない。
  4. 対策 lateinit var myTextView : TextView … override fun onCreate(savedInstanceState:

    Bundle?) { super.onCreate(savedInstanceState) myButton = findViewById(R.id.my_text) 参考:https://qiita.com/takahirom/items/49e18ec7084bb3b1937e lateinitで実装するのが一般的のようです。
  5. Kotlin化が進んでくると class MyButton (context: Context) : android.support.v7.widget.AppCompatButton(context) { private var

    listener: MyBtClickListener? = null init { setOnClickListener { v -> listener?.onMyButtonClick(v.toString()) } } internal interface MyBtClickListener { fun onMyButtonClick(v: String) } //リスナーを追加するメソッド fun set MyBtClickListener(listener: MyBtClickListener) { this.listener = listener } } こんなクラスがあるとします。
  6. こういう書き方にできる private var listener:((v: String)->Unit)? = null init { setOnClickListener

    { v -> listener?.invoke(v.toString()) } } myButton.setMyListener{v->Log.d("hogehoge", v.toString())}. ビルドが通って思った通りに動きます。
  7. 例えばこんなの class Hoge{ private String param1; private String param2; public

    Hoge(String parm1, String param2){ this.param1 = param1; this.param2 = param2; } } Hoge hoge = new Hoge(param1, null); Javaであえてnullを渡している処理が書いてあった。 そもそもnullをあえて渡しているのもどうかと思う人も多いと思いますが、 コンバートした結果
  8. コンバート結果 class Hoge(val parm1: String, val param2: String) { }

    val hoge = Hoge(param1, null!!) !! を付与ることでNotNullに変換することができる