android - 如何使用数据绑定(bind)动态地在 Activity 中扩充框架布局?

标签 android android-activity data-binding android-inflate

我已阅读以下内容 Android include layout dynamically with data-binding library问题。我的问题有点不同。

我有两个 xml,一个用于 Activity :

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="item" type="myapplication.MainActivityViewModel"/>
    </data>
<android.support.constraint.ConstraintLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="myapplication.MainActivity">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/main">
    </FrameLayout>

</android.support.constraint.ConstraintLayout>
</layout>

还有一个框架:

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="item" type="myapplication.FrameViewModel"/>
    </data>
<FrameLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TEST"/>

</FrameLayout>
</layout>

我想通过数据绑定(bind)将 frame.xml 动态扩展到 Activity FrameLayout。换句话说,我想在 Activity 中膨胀不同的框架,就像 fragment 一样,没有 fragment 。 我在 Activity 中尝试了以下内容:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        ViewGroup view = activityMainBinding.main;
        FrameBinding frameBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.frame,view, false);
}

使用该代码,我可以在 Activity 中显示两种布局。我只能看到 Activity 布局。我应该如何更改我的代码才能在 Activity 中看到我的 Activity 布局 View 元素和框架 View 元素?

最佳答案

不清楚您看到的是什么错误,但如果我的猜测是正确的,您应该为框架布局做一个包含。参见 "That include thing"有关如何使用数据绑定(bind)执行此操作的详细信息。

更新 所以,我最初的猜测是不正确的。这是另一个尝试:

如果您不想使用 Fragments,那么请考虑使用简单的 View 替换。以下代码会将一个 FrameLayout 替换为另一个,同时演示数据绑定(bind)不会中断,并且您将继续在布局中看到剩余的原始 View 。显示主屏幕后,单击按钮将一个 FrameLayout 替换为另一个。

这是一个简短的demonstration .

MainActivity.java

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;

import com.example.databindingreplaceview.databinding.ActivityMainBinding;
import com.example.databindingreplaceview.databinding.FrameBinding;

public class MainActivity extends AppCompatActivity {

    private String replacementText = "This is the replacement frame.";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding activityMainBinding =
                DataBindingUtil.setContentView(this, R.layout.activity_main);

        final ViewGroup view = activityMainBinding.main;
        final FrameBinding frameBinding =
                DataBindingUtil.inflate(getLayoutInflater(), R.layout.frame, view, false);
        frameBinding.setReplacementText(replacementText);
        view.getRootView().findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ConstraintLayout layout;

                v.setEnabled(false);
                layout = (ConstraintLayout) view.getRootView().findViewById(R.id.constraintLayout);
                layout.removeView(view.findViewById(R.id.main));
                layout.addView(frameBinding.getRoot());
            }
        });

    }
}

activity_main.xml

<?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">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="This is the top text."
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <FrameLayout
            android:id="@+id/main"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="64dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:text="This is the frame to replace." />

        </FrameLayout>

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="112dp"
            android:text="This is the bottom text."
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="51dp"
            android:text="Replace Frame"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView2" />


    </android.support.constraint.ConstraintLayout>
</layout>

frame.xml

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

    <data>
        <variable
            name="replacementText"
            type="String" />
    </data>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="64dp"
            android:text="@{replacementText}" />

    </FrameLayout>
</layout>

关于android - 如何使用数据绑定(bind)动态地在 Activity 中扩充框架布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43769288/

相关文章:

android - 相对布局避免文本覆盖图像

android - 我可以用蓝牙做到这一点吗?

WPF:绑定(bind)到我的自定义控件不会更新

android - 转换摄氏度/华氏度时值错误

android - 如何在android后台加载谷歌地图?

angular - Angular2 中的共享 RadioButton 组件

c# - Winforms 组合框数据绑定(bind)整个对象(无数据成员)

Android GoogleMap 需要激活吗?

android 4 中的 android RadioButton 问题

java - Android:如何将回调传递给 Activity ?