ViewBinding探索

瞅瞅AS3.6新增ViewBinding

目錄

  • 基本使用
  • 查看ViewBinding實現(xiàn)方式
  • include陵刹,merge,viewstub的配合使用

開啟流程

  • 首先更新AS到3.6版本
  • 打開module的gradle文件
  • 在android函數(shù)里面添加如下代碼,這樣就開啟完成了
android {
    //...
    viewBinding.enabled = true
}

使用

  • 默認情況下布局XML文件都會生成一個 XXXBinding
  • 如有不需要生成Binding類的禁炒,可在跟布局添加屬性 tools:viewBindingIgnore="true"如:
<FrameLayout
    tools:viewBindingIgnore="true">
</FrameLayout>
  • 接著就可以在Activity里面進行使用 XXXBinding 類,該類提供了三個初始化函數(shù)
fun inflate(inflater: LayoutInflater): XXXBinding
fun inflate(inflater: LayoutInflater, parent: ViewGroup, attachToParent: boolean): XXXBinding
fun bind(view: View): XXXBinding
  • 初始化后,可通過返回的XXXBinding類的getRoot函數(shù)獲取布局的跟View锈颗,再通過setContentView添加到Activity
  • XXXBinding實例的成員變量是以布局文件里View的ID來命名
  • 附加兩個例子圖
image
image

以上就是基礎(chǔ)用法

看看ViewBinding為我們做了什么

  • 打開生成的XXXBinding類,文件路徑為: {module_path}/build/generated/data_binding_base_class_source_out/debug/out/cc/xiaobaicz/test/databinding/XXXBinding.java
image
  • 看看實現(xiàn)咪惠,比較簡單的實現(xiàn)击吱, 主要邏輯 在于bind函數(shù)內(nèi)部,可以看到綁定過程做了非空判斷
public final class ActivityMainBinding implements ViewBinding {
  @NonNull
  private final LinearLayout rootView;

  @NonNull
  public final Button btnCancel;

  @NonNull
  public final Button btnSubmit;

  @NonNull
  public final TextView tvMsg;

  private ActivityMainBinding(@NonNull LinearLayout rootView, @NonNull Button btnCancel,
      @NonNull Button btnSubmit, @NonNull TextView tvMsg) {
    this.rootView = rootView;
    this.btnCancel = btnCancel;
    this.btnSubmit = btnSubmit;
    this.tvMsg = tvMsg;
  }

  @Override
  @NonNull
  public LinearLayout getRoot() {
    return rootView;
  }

  @NonNull
  public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
    return inflate(inflater, null, false);
  }

  @NonNull
  public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
      @Nullable ViewGroup parent, boolean attachToParent) {
    View root = inflater.inflate(R.layout.activity_main, parent, false);
    if (attachToParent) {
      parent.addView(root);
    }
    return bind(root);
  }

  //這里是主要的View綁定實現(xiàn)
  @NonNull
  public static ActivityMainBinding bind(@NonNull View rootView) {
    // The body of this method is generated in a way you would not otherwise write.
    // This is done to optimize the compiled bytecode for size and performance.
    String missingId;
    missingId: {
      //綁定View且做了非空判斷遥昧,拋出空指針異常
      Button btnCancel = rootView.findViewById(R.id.btn_cancel);
      if (btnCancel == null) {
        missingId = "btnCancel";
        break missingId;
      }
      Button btnSubmit = rootView.findViewById(R.id.btn_submit);
      if (btnSubmit == null) {
        missingId = "btnSubmit";
        break missingId;
      }
      TextView tvMsg = rootView.findViewById(R.id.tv_msg);
      if (tvMsg == null) {
        missingId = "tvMsg";
        break missingId;
      }
      return new ActivityMainBinding((LinearLayout) rootView, btnCancel, btnSubmit, tvMsg);
    }
    throw new NullPointerException("Missing required view with ID: ".concat(missingId));
  }
}

include覆醇,merge,viewstub的配合使用

  • 單獨使用 include 的情況炭臭,可以直接給 include節(jié)點 添加id永脓,XXXBinding類會直接把需要導入的布局XXXBinding類做為成員變量(變量名為include標簽的id)供開發(fā)者使用; (PS:ViewStub用法和include差不多鞋仍,區(qū)別是 include 的成員變量是 XXXBinding常摧,ViewStub成員變量就是ViewStub自己,然后用法跟原本ViewStub一致) 如:
image

image

image

image
  • 帶 merge 的 include

這個情況有點特殊,帶 merge 標簽的include不能使用ID落午,否則會找不到View報空指針異常

這個情況谎懦,我們可以先初始化主布局,再初始帶 merge 的布局溃斋,如下示例:

image

image

image

好了界拦,這就是ViewBing的基本使用~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梗劫,隨后出現(xiàn)的幾起案子享甸,更是在濱河造成了極大的恐慌,老刑警劉巖梳侨,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛉威,死亡現(xiàn)場離奇詭異,居然都是意外死亡走哺,警方通過查閱死者的電腦和手機蚯嫌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來割坠,“玉大人齐帚,你說我怎么就攤上這事”撕撸” “怎么了对妄?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敢朱。 經(jīng)常有香客問我剪菱,道長,這世上最難降的妖魔是什么拴签? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任孝常,我火速辦了婚禮,結(jié)果婚禮上蚓哩,老公的妹妹穿的比我還像新娘构灸。我一直安慰自己,他們只是感情好岸梨,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布喜颁。 她就那樣靜靜地躺著,像睡著了一般曹阔。 火紅的嫁衣襯著肌膚如雪半开。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天赃份,我揣著相機與錄音寂拆,去河邊找鬼奢米。 笑死,一個胖子當著我的面吹牛纠永,可吹牛的內(nèi)容都是我干的鬓长。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渺蒿,長吁一口氣:“原來是場噩夢啊……” “哼痢士!你這毒婦竟也來了彪薛?” 一聲冷哼從身側(cè)響起茂装,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎善延,沒想到半個月后少态,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡易遣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年彼妻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豆茫。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡侨歉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揩魂,到底是詐尸還是另有隱情幽邓,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布火脉,位于F島的核電站牵舵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倦挂。R本人自食惡果不足惜畸颅,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望方援。 院中可真熱鬧没炒,春花似錦、人聲如沸犯戏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笛丙。三九已至漾脂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胚鸯,已是汗流浹背骨稿。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坦冠。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓形耗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辙浑。 傳聞我的和親對象是個殘疾皇子激涤,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容