Share
Embed
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
2014/07/04 かわいいKotlin勉強会で行った発表の資料です
※ 元々はSlideShareで公開していた資料です。
RyotaMurohoshi
July 14, 2014
Transcript
44 slides
-
͓લͩΕΑ • ໊લ":"྄ࣨଠ • ࣄ":"AndroidΞϓϦ։ൃ(Java)ɺUnityήʔϜ։ൃ(C#) • Twi6er":"@RyotaMurohoshi • ߘઌ":"h6p:/ /qiita.com/RyotaMurohoshi
• ڵຯ":"Kotlin,"Groovy,"C#,"Unity,"SonyͷWearable"Device -
͍Βͬͱ͢Δͳίʔυ̍ button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {
Log.v(TAG, "clicked"); } }); ͲΜͳAndroidೖॻʹࡌ͍ͬͯΔɺΞΫςΟϏςΟͰΑ͘ΈΔίʔυ KotlinͰॻ͍ͨͭͱൺΔͱɺͳͷ͕Ұྎવʂ -
JavaɺKotlinͦΕͧΕͷΫϦοΫϦεφʔ Kotlin button.setOnClickListener { Log.v(TAG, "clicked") } Java button.setOnClickListener(new View.OnClickListener()
{ @Override public void onClick(View v) { Log.v(TAG, "clicked!"); } }); -
JavaͷίʔυΛ͏ҰݟͯΈ·͠ΐ͏ button.setOnClickListener(new View.OnClickListener() { // newҎ߱ຊ࣭͡Όͳ͍ @Override // <- ຊ࣭͡Όͳ͍
public void onClick(View v) { // <- ຊ࣭͡Όͳ͍ Log.v(TAG, "clicked!"); } // <- ຊ࣭͡Όͳ͍ }); // <- ຊ࣭͡Όͳ͍ Javaຊ࣭͡Όͳ͍෦͕ଟ͍ɻKotlinຊ࣭ͷΈΛهड़͢Ε͍͍ Kotlinͳͥ͋Μͳهड़͕Ͱ͖Δͷ͔ʁ -
SAMมͰ͖Δྫ button.setOnClickListener( { (v : View): Unit -> Log.v(TAG, "clicked")
}) button.setOnClickListener( { v -> Log.v(TAG, "clicked")}) button.setOnClickListener{ v -> Log.v(TAG, "clicked") } button.setOnClickListener{ Log.v(TAG, "clicked") } val listener : (View) -> Unit = {v -> Log.v(TAG, "clicked") } //or val listener : (View) -> Unit = { Log.v(TAG, "click") } //or val listener = { (v : View) : Unit -> Log.v(TAG, "clicked") } button.setOnClickListener(listener) -
SAMมͰ͖ͳ͍ྫ // ԼهίϯύΠϧΤϥʔ // Type mismatch val listener : View.OnClickListener
= { (v : View) : Unit -> Log.v(TAG, "clicked") } // Լه࣮ߦ࣌Τϥʔ // java.lang.ClassCastException val listener = { (v : View) : Unit -> Log.v(TAG, "clicked") } as View.OnClickListener ҾʹؔϦςϥϧΛ͞ͳ͍ͱ͍͚ͳ͍ -
VolleyͷStringRequest0Java൛ StringRequest request = new StringRequest( "https://www.google.co.jp/", new Response.Listener<String>() {
@Override public void onResponse(String response) { Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(getApplicationContext(), "onErrorResponse", Toast.LENGTH_LONG).show(); } } ); ແବͳ෦͕ଟ͘ɺॎʹ͍ɽɽɽ -
VolleyͷStringRequest0Kotlin൛ val request = StringRequest( url = "https://www.google.co.jp/", listener =
{ response -> Toast.makeText(this, response, Toast.LENGTH_LONG).show() }, errorListener = { volleyError -> Toast.makeText(this, "onErrorResponse", Toast.LENGTH_LONG).show() } ); ܕύϥʔϝʔλ͕͋ΔΠϯλʔϑΣʔεSAMมՄೳ ໊લ͖ҾͰՄಡੑΞοϓ -
ͪΐͬͱGroovyΈͯΈ·͠ΐ͏ GroovySAMม͕͑ΔΑ͏Ͱ͢ɻ button.setOnClickListener { v -> Toas.makeText(this, "click", Toast.LENGTH_LONG).show() }
Groovy&2.2͔Βasԋࢉࢠ͕͍Βͳ͘ͳͬͨͦ͏Ͱ͢ɻ h"p:/ /groovy.codehaus.org/Groovy+2.2+release+notes -
ͪΐͬͱGroovyΈͯΈ·͠ΐ͏ SAMΠϯλʔϑΣʔε͚ͩͰͳ͘ɺෳϝιουΛ࣋ͭΠϯλʔϑΣʔε Map+Ϋϩʔδϟʔ+asԋࢉࢠͰ͜Μͳײ͡ʹʂ viewPager.setOnPageChangeListener ([ onPageScrollStateChanged: { state -> Log.v(TAG,
state) }, onPageScrolled : { position, positionOffset, positionOffsetPixels -> /*ུ*/ }, onPageSelected : { position -> Log.v(TAG, position) } ] as ViewPager.OnPageChangeListener) h"p:/ /groovy.codehaus.org/Groovy+way+to+implement+interfaces -
࣮AndroidStudioͱIntelliJͩͱ Ұ͚ͭͩϝιουΛ࣮ͨ͠ಗ໊Ϋϥε͕͍͍ײ͡ʹʂ(SAMܕ) button.setOnClickListener((v) -> {Log.v(TAG, "clicked");}); IDE্Ͱ͍͍ײ͡ͰંΓ·Εͯ·͕͢ɺ githubͱ͔ͰίʔυϦϏϡʔ͢Δͱ͖ɺ ΄Β·Εͳ͍͠ɽɽɽ h"p:/
/qiita.com/RyotaMurohoshi/items/0ce799c747d91756131a -
ͱΓ͋͑ͣܧঝ͠·͢ʁ Ac#vityΛܧঝͨ͠ΫϥεBaseAc#vityʹͯɺ͜Μͳϝιουఆٛ͢Εɺ public <T extends View> T findById(int viewId) {
return (T)findViewById(viewId); } BaseAc'vityΛߋʹܧঝͨ͠ΫϥεͰɺ͜Μͳײ͡ͰΩϟετෆཁʹͳΓ·͢Ͷ ImageView imageView = findById(R.id.image_view); -
Extension)Func-onsͷྫ)ఆٛଆ extensions.ktʹͯ package com.mrstar.extensions import android.app.Activity import android.view.View fun <T
: View> Activity.findById (id : Int) : T = findViewById(id) as T -
Extension)Func-onsͷྫ)ར༻ଆ package com.mrstar.android_with_kotlin // ུ import com.mrstar.extensions.findById // <-
public class MainActivity() : FragmentActivity() { // <- protected override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView: ImageView = findById (R.id.image_view) // <- } } -
ͪΐͬͱC#ΈͯΈ·͠ΐ͏ C#ʹ֦ுؔͱಉ͡Α͏ͳ֦ுϝιου͕͋Γ·͢ɻ // ఆٛଆ public static class StringExtensions { public
static string Decorate(this string str, string symbol) { return string.Format("{0}{1}{2}", symbol, str, symbol); } } //ར༻ଆ string decoratedMessage = "Hello!".Decorate("===") ͜Μͳײ͡Ͱɺsta$cͳΫϥεʹsta$cͳϝιουͱ֦ͯ͠ுϝιουΛఆٛ͠·͢ɻ