2017-06-28 10 views
3

、このような変数での活動のビューへの参照を保存することになってAndroidの開発者:KotlinのAndroid拡張機能や変数

Button fooBtn = (Button) findViewById(R.id.btn_foo) 

は、ボイラープレートコードの量とfindViewById呼の数を減らすために。私たちは、単に使用して同じボタンを参照することができKotlin's Android Extensionsの導入により

btn_foo 

質問:btn_fooが保存されたボタンへの参照を

  1. を持っています毎回findViewByIdに電話しますか?
  2. 開発者は、アプリケーションのパフォーマンスを向上させるために変数btn_fooを保存するか、コード内で直接使用するとしますか?

編集:拡張機能がどのように動作するかan explanationがある、しかし、それはまだ少し不明です。

答えて

4

つ:

  • KAEではなく、最初の呼び出しの後のビューへの参照を保持します常にfindViewByIdを使用しています。それはActivitiesFragmentsのためだけに動作します。

  • KAEはデータをキャッシュせず、Activity/Fragmentを除き、他の要素のたびにfindViewByIdを使用します。

だから、あなたがViewHolderを初期化しようとしている場合には:あなたは避けたい正確に何である

((Button)this.itemView.findViewById(R.id.btn_foo)).setText((CharSequence)day.getTitle()); 

:Javaの呼び出しに

class FooViewHolder(view: View): RecyclerView.ViewHolder(view) { 
    fun bind(day: FooItem.Day) { 
     btn_foo.text = day.title 
    } 
} 

逆コンパイルは次のようになります。

開発者はこれを認識している可能性があります。


結論:だけあなたのActivitiies/Fragmentsのために、任意の追加の変数なしKAEを使用して自由に記入してください。

+1

なぜ、「Activities」と「Fragments」に限定されるのですか?それは彼らが 'Context'に簡単にアクセスできるからです。 – Tuby

+1

@Tubyそれは 'Context'に関連し、Kotlinは拡張機能を作成します(https://kotlinlang.org/docs/tutorials/android-plugin.html#under-thehood)。この問題に対処し、 'ViewHolder'(https://github.com/Kotlin/KEEP/pull/33)のような要素にKAEを使用できるようにするGitHub PRがあります。しかし、今は1年間活動していません。 – Oleg

+0

また、Google Data BindingライブラリとMVVMパターンを使用する適切な方法では、 'findViewById'の必要はありません。私は個人的にアーキテクチャコンポーネントが安定するのを待っているので、データバインディングを実装します。その後、プロジェクトを使用して移動する予定です。 – Oleg

5

キャッシュされているので、必要なときにいつもfindViewByIdは呼び出されません。変数を格納することは間違いなく、アプリケーションのパフォーマンスが改善されません

Ihor Kucherenkoがあることが確認さKotlin Androidの拡張(KAE)の開発者の