gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:32:53 25 4
gpt4 key购买 nike

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

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

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

可以像这样使用:

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

我已经看到这种方法也适用于具有不同类型参数的方法的接口(interface),例如:

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
});

最佳答案

Lambda 仅适用于只有 1 个抽象方法要实现的情况。对于 DrawerListener,有 4 个方法需要实现。这就是您无法按照您想要的方式对其进行编码的原因。如果您坚持使用 lambdas ,您可以创建一个扩展 DrawerListener 的接口(interface)并为其中的方法提供默认实现。对于这个 minSDK 版本应该是 24 并且应该启用 jack。

interface CustomDrawerListener extends DrawerLayout.DrawerListener{
@Override
void onDrawerSlide(View drawerView, float slideOffset);

@Override
default public void onDrawerOpened(View drawerView) {
}

@Override
default public void onDrawerClosed(View drawerView) {

}

@Override
default public void onDrawerStateChanged(int newState) {

}
}

然后可以这样写add drawer listener:

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

build.gradle 变化:

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

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

关于java - 如何在 lambda 表达式中使用 Android 的 DrawerLayout.DrawerListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45609888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com