2016-03-29 25 views
3

だから私はKotlin Android Extensionsを使用して、私はそれを使用すると非常に簡単にそれを見つけるのは簡単です。もはやfindViewByIdまたはButterknife.Bind(...)はありません。 1つの状況を除いて、すべてそれに問題はないことがわかった。AndroidでKotlin:ベースクラスとKotlin Android拡張機能

基本クラスでは、たとえばBaseActivityのように、通常は、ツールバーなど、すべてのレイアウトに表示される一連のビューがあります。一般的な操作はchangeToolbarColor()、またはsetToolbarTitle()です。

Kotlin Android Extensionsこの単純なケースでは、基本クラスであるため、ビュー自体が複数のレイアウトに存在し、プロパティをインポートできないため使用できません。この場合は、単にby lazy {find<>(...)を使用します。

これは、build-in android extensionプラグインで実現できますか?

+0

[Kotterknife](https://github.com/JakeWharton/kotterknife)はオプションですか? – AndroidEx

+0

私はAndroid拡張機能を使い始めました:p私は単にKotterKnifeをスキップしました。なぜなら、それは再バインディング・ビューを持たないからです –

答えて

2

Kotlin Android Extensionsは、与えられたレイアウト上の各要素に対して拡張関数を生成します。拡張メソッドは継承モデルの外に存在するため、親にabstract val toolbar:Toolbarのような共通のプロトコルを定義する方法はありません。

ただし、フードの下では、拡張メソッドはfindByIdしか実行しません。指定されたIDがレイアウト上に存在する場合、要素をフェッチします。つまり、レイアウト内の共通の要素(つまり、すべてのツールバーが@id/toolbar)のIDを同じにすると、共通の要素とそれぞれのIDでダミーのレイアウトを作成できます。このレイアウトは一種のインターフェイスとして機能し、import kotlinx.android.synthetic.main.base_activity_dummy.*を実行し、必要な拡張メソッドを生成できます。

BaseActivitythis.toolbarは、ダミーレイアウト上の要素ではなく、具体的なアクティビティの実際の項目を取得します。

もちろん、この手法はエラーが発生しやすく、プログラムを外部者にとって非常に混乱させる可能性があります。しかし、やはりfindByIdをどこにでも呼び出すよりもエラーが発生しにくいでしょう。

関連する問題