2017-08-10 1 views
2

Ich habe das Konzept von Lambdas erkundet und wie sie eine einfachere Syntax bei der Implementierung von funktionalen Schnittstellen bieten.Wie verwendet man Android DrawerLayout.DrawerListener in einem Lambda-Ausdruck?

Gemäß this article, wenn es eine Methode gibt, ist es ziemlich einfach, das Lambda zu implementieren. So

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

Kann wie verwendet werden:

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

habe ich diese Arbeit für Schnittstellen mit Methoden gesehen als auch verschiedene Arten von Argumenten, zum Beispiel:

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

Kann verwendet werden als

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

Also konnte ich onNext gefolgt von onError auf diese Weise verwenden.

Aber nehmen Sie einen Blick auf the DrawerListener interface:

Ich bin nicht in der Lage, dies mit RetroLambda zu verwenden. Die IDE schlägt mir nicht vor, den Code in Lambda zu ändern, und ich kann es auch nicht als solches verwenden. Ich muss es so schreiben ...

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) { 

    } 
}); 

... was nicht ordentlich ist. Ich hoffe auf eine Lösung wie:

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

Antwort

2

Lambdas sind nur geeignet, wenn es nur 1 abstrakte Methode zu implementieren gibt. Im Falle von DrawerListener gibt es 4 Methoden, die implementiert werden müssen. Das ist der Grund, warum Sie es nicht so programmieren können, wie Sie es wollten. Wenn Sie unbedingt Lambdas verwenden möchten, können Sie eine Schnittstelle erstellen, die DrawerListener erweitert und Standardimplementierungen für die Methoden bereitstellt. Für diese MinSDK-Version sollte 24 und Buchse sollte aktiviert sein.

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) { 

    } 
} 

Dann können Sie Schublade Hörer hinzufügen wie folgt schreiben: Änderungen

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

kühlen. Ich denke, diese Problemumgehung ist nicht produktiv, wenn man bedenkt, dass ich eine neue Schnittstelle erstellen muss. Das Ziel war, den Code zu reduzieren, nicht zu erhöhen. Vielen Dank für die Klärung. –

Verwandte Themen