【lambda式が】AndroidStudio【動かない】


3分プログラミング Android Studio編 ~lambda式が動かない~

「javaを活かして何かを作りたい」「ちょっと時間があるから何か技術を身に着けたい」「開発で一儲けして印税(?)生活を楽しみたい・・・w」etc…と考えているそこのあなた!

久しぶりの献立は、Android Studio で lambda式で記述したらプログラムが動かない場合の対処方法です。Androidの調理(トラブルシュート)は難しそう、と思わずまずは挑戦してみましょう。

本日の材料は以下の通りです。

  1. Androidへの興味・・・お好み
  2. Androidへの愛・・・たっぷり
  3. PC※スペックについては#1を参照
  4. 気合と根性・・・お好みで

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

  • このエントリーをはてなブックマークに追加

PAGE TOP