【问题标题】:How to inflate a framelayout in an Activity dynamically with databinding?如何使用数据绑定动态扩展 Activity 中的框架布局?
【发布时间】:2017-10-01 19:56:17
【问题描述】:

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

我有两个用于 Activity 的 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>

我想通过数据绑定将 frame.xml 动态扩展为活动 FrameLayout。换句话说,我想在活动中膨胀不同的帧,就像片段一样,没有片段。 我在 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 布局视图元素和我的框架视图元素?

【问题讨论】:

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


    【解决方案1】:

    目前尚不清楚您看到了什么错误,但如果我的猜测是正确的,您应该为框架布局做一个包含。有关如何使用数据绑定的详细信息,请参阅"That include thing"

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

    如果您不想使用Fragments,请考虑使用简单的View 替换。以下代码将用另一个替换FrameLayout,同时证明数据绑定不会中断,并且您将继续在布局中看到剩余的原始视图。显示主屏幕后,单击按钮将一个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>
    

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多