3分プログラミング Android Studio編 ~lambda式が動かない~
「javaを活かして何かを作りたい」「ちょっと時間があるから何か技術を身に着けたい」「開発で一儲けして印税(?)生活を楽しみたい・・・w」etc…と考えているそこのあなた!
久しぶりの献立は、Android Studio で lambda式で記述したらプログラムが動かない場合の対処方法です。Androidの調理(トラブルシュート)は難しそう、と思わずまずは挑戦してみましょう。
本日の材料は以下の通りです。
- Androidへの興味・・・お好み
- Androidへの愛・・・たっぷり
- PC※スペックについては#1を参照
気合と根性・・・お好みで
lambda式が動かない
先日、ふとAndroidのソースコードをlambda式で書いてみたくなったので以下のコードを準備。
ソース
package com.example.sample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button byAnonymityClass = (Button)findViewById(R.id.anonymityButton); byAnonymityClass.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "Anonymity", Toast.LENGTH_SHORT).show(); } } ); Button byLambda = (Button)findViewById(R.id.lambdaButton); byLambda.setOnClickListener(v -> Toast.makeText(MainActivity.this, "Lambda", Toast.LENGTH_SHORT).show()); //ここがあるとうまくいかない } }
レイアウト
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.sample.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textView" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Anonymity" android:id="@+id/anonymityButton" android:layout_below="@+id/textView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Lambda" android:id="@+id/lambdaButton" android:layout_below="@+id/anonymityButton" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
実行してみると
Error:A problem occurred configuring project ':app'. > Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.
と表示されコンパイルがうまくいっていない模様。
どうしようか
解決策
googleの公式レファレンスを見てみると、次のような表記を発見。
「…(前略)Java 8 の新言語機能を使うには、Jack ツールチェーンも必要になります。(後略)…」
更に、その下にサンプルがあったのでそれに合わせてbuild.gradleを修正してみたら。。。動いた!!
修正前
(省略) android { (省略) defaultConfig { applicationId "com.example.sample" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" } buildTypes { (省略) } compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 } }
修正後
(省略) android { compileSdkVersion 24 buildToolsVersion "24.0.2" defaultConfig { applicationId "com.example.sample" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" jackOptions{ //この3行を追加 enabled true // } // } buildTypes { (省略) } compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 } }
実行画面
ボタンも動いているし、大丈夫そう!やったね!!
これであなたも今日からAndroidの開発者の仲間入りですね。