如何在lambda表达式中使用Android的DrawerLayout.DrawerListener?

时间:2017-08-10 09:36:51

标签: java android lambda java-8 retrolambda

我一直在探索lambdas的概念,以及它们在实现功能接口时如何提供更简单的语法。

根据this article,如果有一种方法,那么实现lambda非常容易。所以,

interface OnClickListener {
    public void onClick(View v);
}

可以像:

一样使用
etDate.setOnClickListener(view -> Timber.i("the date is xyz"));

我已经看到这个工作用于具有不同类型参数的方法的接口,例如:

public interface Observer<T> {
    void onSubscribe(Disposable d);
    void onNext(T t);
    void onError(Throwable e);
    void onComplete();
}

可以用作

api.getData()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(response -> {
               Toast.makeText(this, "Result: " + response.toString(), Toast.LENGTH_LONG).show();
            }, error -> {
                Toast.makeText(this, "API returned an error: " + error.getLocalizedMessage(), Toast.LENGTH_LONG).show();
            });

所以我能够以这种方式使用onNext后跟onError。

但请看一下the DrawerListener interface

我无法使用RetroLambda来使用它。 IDE不建议我将代码更改为lambda,我也不能这样使用它。我必须这样写...

drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
    @Override
    public void onDrawerSlide(View drawerView, float slideOffset) {
        // My action goes here
    }

    @Override
    public void onDrawerOpened(View drawerView) {
    }

    @Override
    public void onDrawerClosed(View drawerView) {

    }

    @Override
    public void onDrawerStateChanged(int newState) {

    }
});

......这不是很整洁。我希望有一个解决方案来写它:

drawer.addDrawerListener(view, offset -> {
        // My action goes here
    });

1 个答案:

答案 0 :(得分:2)

仅当只有一个抽象方法要实现时,Lambda才适用。在DrawerListener的情况下,有4种方法需要实现。这就是你不能按照你想要的方式编码的原因。如果您坚持使用lambdas,则可以创建一个扩展DrawerListener的接口,并为其中的方法提供默认实现。对于这个minSDK版本应该是24并且应该启用插孔。

android {
    defaultConfig {
        minSdkVersion 24
        //others
        jackOptions {
            enabled true
        }
    }

    //other stuff
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

然后你可以按如下方式编写添加抽屉监听器:

{{1}}

build.gradle更改:

{{1}}