日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

学学Viewbinding

發(fā)布時間:2024/8/26 综合教程 21 生活家
生活随笔 收集整理的這篇文章主要介紹了 学学Viewbinding 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Viewbinding

1.環(huán)境需求

環(huán)境上,需要Android Studio 3.6 Canary 11+

同樣的Gradle也需要升級(這年頭都4.0了,應(yīng)該沒有還在用低版本的了吧...)

2.配置viewbinding

gradle 版本在 3.6 - 3.9 以上的:

app文件夾 下的 build.grale 里面添加

android {
    ...
    viewBinding {
        enabled = true
    }
}
    

如果你的 gradle 是 4.0+ ,那么需要改一下寫法

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

否則可能會報一個warnning,雖然不改并大概率不影響使用,但作為一個優(yōu)秀程序員湊合了事可不是什么好習(xí)慣

DSL element 'android.viewBinding.enabled' is obsolete and has been replaced with 'android.buildFeatures.viewBinding'.

3.用法

原理

Viewbinding 的原理就是根據(jù) idbuild 文件夾下生成對應(yīng)的 java類,然后在 java類 里面自動幫你 findViewById(對,沒錯,原理還是findViewById,并沒什么新鮮的),布局文件里面的子控件,就對應(yīng) java類 里面的 field(成員變量)
然后你就可以調(diào)用 java 類來操作控件

對應(yīng)生成的java類文件,名字就是 刪除下劃線 再加 Binding

例如:activity_main.xml ==> ActivityMainBinding.java

某些布局不用viewbinding

如果你不希望某個布局(layout)被 Viewbinding 所“控制”(生成java類文件),那就添加 tools:viewBindingIgnore="true"

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:viewBindingIgnore="true">
    ...

</LinearLayout>

Tip:可能這里你有一個騷操作——我布局采用 Viewbinding 但,某個控件不用,我自己 findViewById ,想法不錯,但是Google不同意,在子布局或控件里加 tools:viewBindingIgnore="true" 是無效的

實(shí)戰(zhàn)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding mMainBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mMainBinding.getRoot());
    }
}

這個代碼用法非常簡單,就是聲明一個Viewbinding幫我們生成的ActivityMainBinding,然后用inflate加載他,getRoot就是獲得他的根布局,跟R.layout.activity_main是一個東西。

inflate我多說兩句

inflate 跟Layoutinflate的inflate不是一個方法,但用法類似。
作用就是加載布局(初始化ViewBinding)

源碼是

  @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);
  }

一共兩個重載,還是很好理解的,用過LayoutInflate的肯定一看就明白

如果parent為null,attachToParent將失去作用,設(shè)置任何值都沒有意義。

如果parent不為null,attachToParent設(shè)為true,則會給加載的布局文件的指定一個父布局,即parent。

如果parent不為null,attachToParent設(shè)為false,則會將布局文件最外層的所有l(wèi)ayout屬性進(jìn)行設(shè)置,當(dāng)該view被添加到父view當(dāng)中時,這些layout屬性會自動生效。

在不設(shè)置attachToParent參數(shù)的情況下,如果parent不為null,attachToParent參數(shù)默認(rèn)為true。

加載控件(套娃模式)

我們先在 activity_main.xml 添加一個textView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FF8686"
        android:text="111"**
        android:textSize="40sp" />

</LinearLayout>

再在 MainActivity 里面編寫調(diào)用代碼

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding mMainBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mMainBinding.getRoot());

        mMainBinding.text.setText("dududududu");
    }
}

調(diào)用很簡單,直接 mMainBinding.text.settext就可以了,這跟我們之前說的將控件 生成為java類 的成員變量也十分符合。

可我為什么稱它為套娃模式呢???我們再嘗試添加一個 嵌套一個layout試試

新建一個布局叫:layout_include.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/include_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50sp" />

</FrameLayout>

再修改 activity_main.xml 的內(nèi)容,將layout_include加載進(jìn)去

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    ...>

    <TextView
     ... />

    <include 
        android:id="@+id/include"
        layout="@layout/layout_include" />
</LinearLayout>

那么我們怎么調(diào)用 layout_include.xml 里面的 textview 呢???

我們修改MainActivity里面的代碼

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding mMainBinding;
    private LayoutIncludeBinding mIncludeBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mMainBinding.getRoot());

        mMainBinding.text.setText("dududududu");

        mMainBinding.include.includeText.setText("qqqqqqqqqqq");

    }
}

這就是套娃模式(當(dāng)然名字是我起的)

 mMainBinding.include.includeText.setText("qqqqqqqqqqq");

在布局嵌套多的時候,層層調(diào)用。
這也很好理解, mMainBinding.include 這返回的是layout_include

 mMainBinding.include.includeText.setText("qqqqqqqqqqq");

這行就是 layout_include 調(diào)用自己的includeText。

別以為到這你就全會了,萬一有一個布局用了 merge 怎么辦???

用到merge

merge是一個解決父布局多余嵌套的一個標(biāo)簽,他不會最終加載到布局里,更多的是作為一個標(biāo)志存在

**比如我們修改 layout_include.xml **

<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/include_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50sp" />

</merge>

這時候你再運(yùn)行肯定就報錯了,那是因?yàn)椋琺erge并不會加載到布局里,而我們又給 include 添加了id,所以Viewbinding在生成 java類 的時候,隨著id找過來,發(fā)現(xiàn)是merge,無從下手,就奔潰了。

怎么解決這個問題呢??

將include的id去掉不就行了, O

你這會兒肯定又不樂意了,去掉怎么調(diào)用 include_text 呢???

細(xì)心的小可愛肯定發(fā)現(xiàn)了上面的inflate的源碼,第一個重載調(diào)用第二個重載,第二個返回 bind(root) 。

bind 就是我們需要用到的方法了。

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding mMainBinding;
    private LayoutIncludeBinding mIncludeBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mMainBinding.getRoot());
        ...

        mIncludeBinding = LayoutIncludeBinding.bind(mMainBinding.getRoot());
        mIncludeBinding.includeText.setText("lalala");
    }
}

我們先聲明了一個 LayoutIncludeBinding ,然后調(diào)用 LayoutIncludeBinding.bind(mMainBinding.getRoot()) 將其初始化,也就是將他綁定到 mMainBinding.getRoot() 上,也就是他的父布局。
這時候我們再調(diào)用 mIncludeBinding.includeText.setText("lalala"); 就沒問題了

到此,關(guān)于ViewBinding基本都已經(jīng)學(xué)完了,其他使用上的一些技巧就交給大家去探索了!

總結(jié)

以上是生活随笔為你收集整理的学学Viewbinding的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品xxxx| 国产自产在线 | 五月婷网站| 交专区videossex另类 | 超碰97人| 视频在线观看网站免费 | 朝桐光av一区二区三区 | 国产精品久久久久久久久夜色 | 亚洲精品一区二区在线 | 亚洲黄色录像 | 国产女人爽到高潮a毛片 | 男人看的网站 | 日韩欧美高清片 | 国产欧美一区二区视频 | 女人下面流白浆的视频 | 放荡闺蜜高h季红豆h | 日本wwwwwww | 精品在线观看视频 | 香蕉视频在线播放 | 精品国产乱码久久久 | 天天干夜夜夜夜 | 人妻互换一区二区三区四区五区 | 2022av视频 | 国产福利视频一区二区三区 | 少妇aa | 小视频在线看 | 日本免费a视频 | 69式视频| 亚洲九九九九 | 国产精品一区二区三区四区五区 | www.youjizz国产 | 国产精品无码久久av | 国产 日韩 一区 | 中文字幕在线观看欧美 | 成年人的天堂 | sese欧美| 嫩模被强到高潮呻吟不断 | 伊人久久一区 | 日韩欧美一区二区三区四区五区 | 手机av网 | 欧美性受黑人性爽 | 国产精品一区在线 | 欧美成人免费观看 | 国产精品久久久久久久天堂 | 亚洲精品国产一区二区 | 99视频热| 中文字幕一区在线播放 | 成人在线观 | 91在线观看视频 | 亚洲精品无人区 | 免费看a视频| 91丝袜呻吟高潮美腿白嫩在线观看 | 欧美精品一区二区三区久久久竹菊 | 91精品国产成人www | 无遮挡边吃摸边吃奶边做 | 黄色激情小说视频 | 亚洲人成在线免费观看 | 久久桃色 | 91av在线播放 | 男女www | 免费在线性爱视频 | 国产主播啪啪 | 少妇把腿扒开让我舔18 | 91在线精品李宗瑞 | 噜噜吧噜噜色 | 精品在线一区二区 | 亚洲九九精品 | 欧美男人天堂 | 国产男女猛烈无遮挡免费视频 | 国产欧美精品一区二区三区 | 先锋影音在线 | 国产av天堂无码一区二区三区 | 亚洲最新视频 | 国产免费一区二区三区在线观看 | 五月天国产在线 | 亚洲成a人片77777kkkk | 一对一色视频聊天a | 日韩伦理一区二区三区 | 性感美女被爆操 | 成人污在线 | 欧美最猛性xxxxx(亚洲精品) | 制服丝袜在线看 | 99精品无码一区二区 | 美女黄污网站 | 中文字幕第一页在线 | 伊人综合影院 | www.亚洲综合 | 免费成人深夜在线观看 | 99热精品在线播放 | 麻豆视频官网 | 国产成人精品一区 | 午夜精品影院 | 99久久精品免费看国产四区 | 欧美日韩在线国产 | 偷偷久久 | 亚洲综合激情另类小说区 | 六月激情| 久久一级黄色片 | 91麻豆一区二区 |