【问题标题】:How to use Android’s DrawerLayout.DrawerListener in a lambda expression?如何在 lambda 表达式中使用 Android 的 DrawerLayout.DrawerListener?
【发布时间】:2017-08-10 09:36:51
【问题描述】:

我一直在探索 lambda 的概念以及它们如何在实现函数式接口时提供更简单的语法。

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

【问题讨论】:

    标签: java android lambda java-8 retrolambda


    【解决方案1】:

    Lambda 仅适用于只有 1 个抽象方法要实现的情况。对于 DrawerListener,有 4 个方法需要实现。这就是您无法按照您想要的方式对其进行编码的原因。如果您坚持使用 lambdas ,您可以创建一个扩展 DrawerListener 的接口,并为其中的方法提供默认实现。对于这个 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) {
    
        }
    }
    

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

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

    【讨论】:

    • 酷。考虑到我必须创建一个新界面,我想这种解决方法并不高效。目标是减少代码而不是增加代码。非常感谢您为我解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多