如何使用数据绑定动态膨胀活动中的框架布局?



我已经阅读了以下Android包含动态布局与数据绑定库问题。我的问题有点不同。

我有两个用于活动的 xml 一个:

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

我想通过数据绑定动态地将框架膨胀.xml到活动 FrameLayout。换句话说,我想在活动中膨胀不同的帧,就像片段一样,没有片段。 我在活动中尝试了以下操作:

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

使用该代码,我可以在活动中显示两个布局。我只能看到"活动"布局。我应该如何更改我的代码,以便能够在活动中查看我的活动布局视图元素和框架视图元素?

目前尚不清楚您看到的错误,但是,如果我的猜测是正确的,您应该对框架布局进行包含。有关如何使用数据绑定执行此操作的详细信息,请参阅"包含事物"。

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

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

这是一个简短的演示。

主活动.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>

框架.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>

最新更新