跳至主要内容

Android databinding 传递变量 给 include 布局

Android databinding 传递变量 给 include 布局

Android databinding 传递变量 给 include 布局

一个问题:根布局变量如何传递给 include 引入的子布局中呢?

子布局 layout_own_table

子布局也需要用 layout 包裹,并用以下写法去声明变量

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="ownVm"
            type="com.example.uidemo.mvvm.viewmodel.framgent.HouseRecordModel" />
    </data>
    ....
</layout>

如下:

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

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="ownVm"
            type="com.example.uidemo.mvvm.viewmodel.framgent.HouseRecordModel" />
    </data>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/constraintLayout"
        app:layout_constraintVertical_bias="1.0">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/constraint2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="50dp"

            app:layout_constraintTop_toTopOf="parent">

            <ImageView
                android:id="@+id/iv_line"
                android:layout_width="0dp"
                android:layout_height="1dp"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:layout_marginEnd="16dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/et_own_id_number"
                app:srcCompat="@android:color/darker_gray" />

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="24dp"
                android:text="不动产权证"
                android:textColor="#252525"
                android:textSize="18sp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/iv_line" />

            <TextView
                android:id="@+id/tv_title1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:text="房屋证件类型"
                android:textColor="#252525"
                android:textSize="18sp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/tv_deed_type"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:text="房屋证"
                android:textColor="#252525"
                android:textSize="16sp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tv_title1" />


            <TextView
                android:id="@+id/tv_title2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="24dp"
                android:text="证件编号"
                android:textColor="#252525"
                android:textSize="18sp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/iv_line1" />

            <Button
                android:id="@+id/bt_commint_own"
                android:layout_width="0dp"
                android:layout_height="50dp"
                android:layout_marginStart="16dp"
                android:layout_marginTop="32dp"
                android:layout_marginEnd="16dp"

                android:background="@color/blackBackground"
                android:text="提交"
                android:textColor="@color/blackGold"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="1.0"
                app:layout_constraintStart_toEndOf="@+id/iv_add_images"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/iv_add_images" />

            <ImageView
                android:id="@+id/iv_add_images"
                android:layout_width="101dp"
                android:layout_height="125dp"
                android:layout_marginStart="16dp"
                android:layout_marginTop="32dp"
                android:background="@drawable/icon_add_images"
                android:scaleType="fitXY"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tv_title" />

            <ImageView
                android:id="@+id/iv_none"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_marginTop="144dp"
                android:layout_marginEnd="16dp"
                android:background="#ffffff"
                android:visibility="invisible"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/bt_commint_own" />

            <ImageView
                android:id="@+id/iv_line1"
                android:layout_width="0dp"
                android:layout_height="1dp"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:layout_marginEnd="16dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tv_deed_type"
                app:srcCompat="@android:color/darker_gray" />

            <EditText
                android:id="@+id/et_own_id_number"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:layout_marginEnd="16dp"
                android:background="@null"
                android:ems="10"
                android:hint="如:鄂(2018)恩施市不动产权第0012321号"
                android:inputType="text"
                android:text="@={ownVm.NetName}"
                android:textColor="#252525"
                android:textSize="14sp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tv_title2" />

        </androidx.constraintlayout.widget.ConstraintLayout>
    </ScrollView>
</layout>

主布局

现在我们要把 mVM 传到 子布局 layout_own_table 中,实现数据的双向绑定

第一步:按照一般方式导入 ViewModel

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View" />

        <import type="com.example.uidemo.mvvm.viewmodel.framgent.HouseRecordModel" />

        <variable
            name="mVM"
            type="com.example.uidemo.mvvm.viewmodel.framgent.HouseRecordModel" />
    </data>
    ...
</layout>

第二步:在 include tag 中使用 app:子布局定义的变量="@{mVM}" 进行传递

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View" />

        <import type="com.example.uidemo.mvvm.viewmodel.framgent.HouseRecordModel" />

        <variable
            name="mVM"
            type="com.example.uidemo.mvvm.viewmodel.framgent.HouseRecordModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        tools:context=".ui.framgent.record.HouseRecordFragment">
		...
        <include
            android:id="@+id/layout_own_table"
            layout="@layout/fragment_house_record_own"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:visibility="@{mVM.isEnableOwnTable ? View.VISIBLE : View.INVISIBLE }"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/constraintLayout"
            app:layout_constraintVertical_bias="1.0"
            app:ownVm="@{mVM}" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

第三步:最终效果

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View" />

        <import type="com.example.uidemo.mvvm.viewmodel.framgent.HouseRecordModel" />

        <variable
            name="mVM"
            type="com.example.uidemo.mvvm.viewmodel.framgent.HouseRecordModel" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        tools:context=".ui.framgent.record.HouseRecordFragment">

        <include
            android:id="@+id/navtitle"
            layout="@layout/nav_black" />

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/constraintLayout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintStart_toStartOf="@+id/navtitle"
            app:layout_constraintTop_toBottomOf="@+id/navtitle">

            <Button
                android:id="@+id/bt_show_own"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_marginStart="16dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="8dp"
                android:layout_marginBottom="24dp"
                android:background="@drawable/icon_record_myself_normal"
                android:onClick="@{()->mVM.showOwnTable()}"
                android:text=""
                app:NPImageIsEnable="@{mVM.isEnableOwnTable}"
                app:NPImageNegativeDrawable="@{@drawable/icon_record_myself_normal}"
                app:NPImagePositiveDrawable="@{@drawable/icon_record_myself_selected}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/guideline_center"
                app:layout_constraintHorizontal_bias="1.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/textView6"
                app:layout_constraintVertical_bias="1.0" />

            <TextView
                android:id="@+id/textView6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="18dp"
                android:layout_marginTop="24dp"
                android:text="经营类型"
                android:textColor="#2b2e49"
                android:textSize="18sp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Button
                android:id="@+id/bt_show_lease"
                android:layout_width="0dp"
                android:layout_height="60dp"
                android:layout_marginStart="8dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="16dp"
                android:layout_marginBottom="24dp"
                android:background="@drawable/icon_record_rent_normal"
                android:onClick="@{()->mVM.showLeaseTable()}"
                android:text=""
                app:NPImageIsEnable="@{mVM.isEnableLeaseTable}"
                app:NPImageNegativeDrawable="@{@drawable/icon_record_rent_normal}"
                app:NPImagePositiveDrawable="@{@drawable/icon_record_rent_selected}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="@+id/guideline_center"
                app:layout_constraintTop_toBottomOf="@+id/textView6" />

            <androidx.constraintlayout.widget.Guideline
                android:id="@+id/guideline_center"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                app:layout_constraintGuide_percent="0.5" />

        </androidx.constraintlayout.widget.ConstraintLayout>

        <include
            android:id="@+id/layout_lease_table"
            layout="@layout/fragment_house_record_lease"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:visibility="@{mVM.isEnableLeaseTable ? View.VISIBLE : View.INVISIBLE }"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/constraintLayout"
            app:layout_constraintVertical_bias="1.0" />


        <include
            android:id="@+id/layout_own_table"
            layout="@layout/fragment_house_record_own"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:visibility="@{mVM.isEnableOwnTable ? View.VISIBLE : View.INVISIBLE }"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/constraintLayout"
            app:layout_constraintVertical_bias="1.0"
            app:ownVm="@{mVM}" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Written with StackEdit.

评论

此博客中的热门博文

Lambda can be replaced with method reference

Lambda can be replaced with method referenceAndroid开发的时候提示 Lambda can be replaced with method reference只需要按下 Alt + Enter 即可效果如下参考资料How to change Runnable to lambda expression in Java with IntelliJ shortcut

ffmpeg 音频淡出淡出并调整音量

ffmpeg 音频淡出淡出并调整音量1 淡出淡入ffmpeg -i 青花瓷.aac -filter_complex "[0:a]afade=t=in:ss=0:d=5[a1]; [a1]afade=t=out:st=60:d=5[a2]; [a2]volume=0.1" t.mp3 青花瓷.aac 是第0个输入文件
[0:a] 代表是处理第0个输入文件的(Audio)音频文件[0:a]afade=t=in:ss=0:d=5[a1] 处理 [0:a] 资源从第 0 秒开始淡入,持续5秒 ,并标记这个过滤器名为 [a1]
过滤器名字可以随便取,但要符合命名规范,请自行查询 ffmpeg 过滤器命令规范。[a1]afade=t=out:st=60:d=5[a2] 处理 [a1] 的资源,从第60秒开始淡出,持续5秒。注意:淡出结束后,后面的音频将全部静音[a2]volume=0.1 2 处理音频处理 [a2] 资源的音量,为原来的 0.1 倍音量。t.mp3 为输出的音频

ffmpeg-filter 使用指南

ffmpeg-filter 使用指南说明只是一份备份。查看原文作者:hguoFilter 思想filter 架构思想中第一个概念是 Graph,一般翻译为画布,如果 Graph 看做是桌子的话,那 filters 们就是桌子上的“悲剧”。所以先要有 Graph,然后再将 filter 摆在上面, filter是身上有 pin 接口, pin 的作用是统一数据接口,然后还需要一个 link 的动作, link 的作用是将指定的 2 个 filter 通过其 pin 接口连接起来,这样就形成了一个完整的 filter graph或是叫 filter link list。List item如果只有 filter graph 的存在,它只是一堆参数数据和代码,并不能运行,需要一个动力泵或是动力引擎将整个过程驱动起来,这就像人还缺一颗心脏一样,那人的血液就是filter graph 的数据流。这样 FFmpeg 就把驱动的能力交给了 filter 框架外面来做,通过向 filter graph 的首个 filter 推数据和从 filter graph 的末尾 filter 拉数据从而驱动整个 filter graph 的数据流动。命令行使用命令ffmpeg -i file_copy.ts -i logo.png -filter_complex " [1:v]scale=100:100[logo]; [0:v][logo]overlay=x=main_w-100:y=main_h-100" output.mp4 参数简记-filter_complex:滤镜必选参数,后面跟滤镜命令[1:v] :输入pin,表示视频的第1路scale=100:100 :对[1:v]输入pin的处理,缩放成100:100[logo] :输出pin; 每个滤镜分割0:v :两个输入,第一个视频,上一个滤镜的输出overlay=x=main_w-100:y=main_h-100 :滤镜动作