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の開発者の仲間入りですね。


