databinding實踐

前言

依稀還記得4年前剛入門的時候,每次寫代碼都是通過findViewById去拿到控件,然後使用控件。工作1年後,我發現了jakewharton大神的butterknife,然後開始使用資源綁定,那時候爲了方便,我在Settings的Plugin裏找到了Zelezny插件,控件的拿取都是一鍵生成的。美滋滋的使用了幾年後,我發現了databinding這個東西。講道理,我一直很反感各種命名各種找控件,databinding給我解決了這個問題。

3種拿到控件方式

  • findViewById:最原始的方式,也是最穩定的方式,缺點是代碼多,看起來冗餘。
  • butterknife:非常優秀的開源控件,功能也多,使用者多,一直在更新,沒得說的。
  • databinding:不管是Androidx時代還是support包的時代,databinding都是支持的,讓Android開發也可以像web前端那樣數據佈局雙向綁定了,減少了出錯率,提高了效率。麻煩點的地方可能是修改的時候要編譯項目吧。

實踐一(support時代如何使用databinding)

第一步,在build.gradle的android標籤下添加

//打開DataBinding
dataBinding {
  enabled = true
}

第二步

在佈局中將最外層佈局替換成<layout>標籤,然後編譯一下,會自動生成文件,比如activity_main.xml佈局,會生成ActivityMainBinding文件

第三步使用

  • Activity中使用,以MainActivity爲例
/**
 * @author haizhuo
 */
public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
        //使用DataBinding,綁定後可以直接拿到控件,不需要使用findView去找,也不需要使用ButterKnife了
        //舉個例子,設置id爲id_content的控件透明度爲80%
        binding.idContent.setAlpha(0.8f);
    }
}

  • fragment中使用,以fragment_balance.xml爲例
private FragmentBalanceBinding binding;

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding= DataBindingUtil.inflate(inflater,R.layout.fragment_balance,container,false);
        return binding.getRoot();
    }

後話

雙向綁定需要使用到ViewModel,具體實現請查看DataBindingWithSupportDemo

實踐二,使用Androidx,jetpack工具

使用Androidx方式的databinding呢,使用方式與上面類似,只是依賴包發生了變化,而且因爲jetpack工具的存在,能玩出更多的東西。

後話

相關demo請查看ViewModelDemo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章