2017-08-10 1 views
2

私はlambdaの概念を探求しており、機能的なインタフェースを実装しながら、より単純な構文を提供する方法についても検討してきました。AndroidのDrawerLayout.DrawerListenerをラムダ式で使用するにはどうすればいいですか?

this articleによれば、1つの方法がある場合、ラムダを実装するのは非常に簡単です。私は、例えば、同様の引数の種類が異なるメソッドを持つインタフェースに対して、この作品を見てきました

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

ができるよう、

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

は次のように使用することができます

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はコードをラムダに変更するよう提案しておらず、そのように使用することもできません。私はこれのように書く必要があります...

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

答えて

2

ラムダは実装する抽象メソッドが1つしかない場合にのみ適しています。 DrawerListenerの場合、実装する必要のあるメソッドが4つあります。それがあなたが望むようにコード化できない理由です。ラムダの使用を強くお考えの場合は、DrawerListenerを継承し、その中のメソッドのデフォルトの実装を提供するインターフェイスを作成することができます。このminSDKのバージョンは24で、ジャックを有効にする必要があります。

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

クールを

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

その後、あなたは次のように引き出しリスナーを追加記述することができます。私はこの回避策は、私は新しいインターフェイスを作成する必要があると考えて生産性ではないと思う。目標はコードを減らさずに増加させることでした。これをクリアしてくれてありがとう。 –

関連する問題