<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                對于Android開發者來說,對findViewById()這個方法一定不會陌生:在我們對視圖控件操作前,我們需要通過findViewById方法來找到其對應的實例。因為一個界面里視圖控件的數量可能會非常多,所以在Android開發早期我們通常都會看到一大片的`findViewById(R. id.view_id)`樣板代碼。舉一個最常見的例子: ``` import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; public class LoginActivity extends AppCompatActivity { Button loginButton; EditText nameEditText; EditText passwordEditText; … @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); loginButton = findViewById(R.id.btn_login); nameEditText = findViewById(R.id.et_name); passwordEditText = findViewById(R.id.et_password); … } } ``` 在一個登錄界面中,至少包含登錄按鈕(loginButton)、登錄名輸入框(nameEditText)、密碼輸入框(passwordEditText),實際情況只會更復雜。在老版本SDK中,findBiewById獲取到的類型是View,我們還需要進行類型強制轉換。 ``` loginButton = (Button)findViewById(R.id.btn_login); ``` 幸運的是,在Kotlin中我們可以利用擴展函數來簡化這個煩瑣的過程: ``` fun <T : View> Activity._view(@IdRes id: Int): T { return findViewById(id) as T } ``` 現在,在兼容老版本的情況下,我們可以將代碼改為這樣: ``` loginButton =_view(R.id.btn_login); nameEditText = _view(R.id.et_name); passwordEditText = _view(R.id.et_password); ``` 現在調用起來是比較方便了,但是部分極簡主義的讀者可能會想:當前我們還是需要創建loginButton、nameEditText、passwordEditText的實例,但是這些實例似乎只充當了一個“臨時變量”的角色,我們依靠它進行一些點擊事件綁定(onlick)、賦值操作后好像就沒什么用處了。能不能將其也省略掉,直接對`R.id.*`操作呢?答案是可以,在Kotlin中我們可以利用高階函數,做如下改動(此處以簡化onclick為例子): ``` fun Int.onClick(click: ()->Unit){ // _view為我們之前定義的簡化版findViewById val tmp = _view <View>(this).apply { setOnClickListener{ click() } } } ``` 我們就可以這樣綁定登錄按鈕的點擊事件: ``` R.id.btn_login.onClick { println("Login…") } ``` 可能有強迫癥的讀者會受不了`R.id.xx`這樣的寫法,并且每次都要寫R.id前綴,某種情況下也會造成煩瑣。那還有更簡潔的寫法嗎?答案是肯定的,Kotlin為我們提供了擴展插件,gradle默認就集成了: ``` apply plugin: 'kotlin-android-extensions' ``` 回到最原始的LoginActivity,我們只用額外`import kotlinx.android.synthetic.main.activity_login.*`,即可直接用視圖中組件的id名稱來操作視圖: ``` btn_login.setOnClickListener { println("MainKotlinActivity onClick Button") } ``` 這時候,或許還會有讀者疑惑:雖然是省略了`R.id.`幾個字符,但是引入是否會造成性能問題?值得引入、使用kotlin-android-extensions嗎?還是用慣常的做法,讓我們先對其反編譯,看看其對應Java代碼中是如何實現的: ``` public final class MainActivity extends BaseActivity { private HashMap _$_findViewCache; protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(2131296283); ((Te xtView)this._$_findCachedViewById(id.label)).setText((CharSequence)"Dive Into Kotlin"); ((Te xtView)this._$_findCachedViewById(id.label)).setOnClickListener((OnClickListener)null.INSTANCE); ((Bu tton)this._$_findCachedViewById(id.btn)).setOnClickListener((OnClickListener)null.INSTANCE); } public View _$_findCachedViewById(int var1) { if(this._$_findViewCache == null) { this._$_findViewCache = new HashMap(); } View var2 = (View)this._$_findViewCache.get(Integer.valueOf(var1)); if(var2 == null) { var2 = this.findViewById(var1); this._$_findViewCache.put(Integer.valueOf(var1), var2); } return var2; } public void _$_clearFindViewByIdCache() { if(this._$_findViewCache ! = null) { this._$_findViewCache.clear(); } } } ``` 你會驚喜地發現,在第一次使用控件的時候,在緩存集合中進行查找,有就直接使用,沒有就通過findViewById進行查找,并添加到緩存集合中。其還提供了`$clearFindViewById Cache()`方法用于清除緩存,在我們想要徹底替換界面控件時可以使用。 ***** 注意 Fragment的`onDestroyView()`方法中默認調用了`$clearFindViewByIdCache()`清除緩存,而Activity沒有。 ***** 當然,我們**并沒有完全離開findViewById,只是Kotlin的擴展插件利用緩存的方式讓我們開發更方便、更快捷**。 還有很多場景都利用了擴展函數,由于篇幅的限制,這里不再介紹。感興趣的讀者可以了解一下Google推出的Android擴展庫Android KXT(https://github.com/android/android-ktx)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看