1

我对这段代码有疑问:

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        } else {
            //noinspection deprecation
            view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
        getDefaultIntent();
    }
});

我想将此代码转换为使用这样的 lambda 表达式:

view.getViewTreeObserver().addOnGlobalLayoutListener(()->{
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    } else {
        //noinspection deprecation
        view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
    getDefaultIntent();
});

但它不会工作,因为现在this不引用内部类。

4

2 回答 2

0

尝试通知参数,(this)的“完整地址”。

removeGlobalOnLayoutListener(this);

像这些:

removeGlobalOnLayoutListener(MainActivity.this);

当然,您需要告知您的真实班级名称。

于 2015-09-26T01:05:56.533 回答
0

根据Java 规范

lambda 主体中由表示的值与周围上下文中this由 表示的值相同。this

因此,如果您需要使用this来引用匿名对象,则需要使用显式匿名对象,而不是 lambda。解决方法是像您的原始代码一样编写它。

Lambda 是一种在很多情况下都很有用的工具,但不需要在所有情况下都使用。

于 2015-09-26T01:44:43.640 回答