Android 如何通过扩展BaseActivity的数据绑定显示childActivity?

Android 如何通过扩展BaseActivity的数据绑定显示childActivity?,android,data-binding,layout-inflater,Android,Data Binding,Layout Inflater,我正在使用一个基本活动作为另一个活动“RecicpeActivity”的父活动,因为我已重写了基本活动中的方法setContentView,以便子活动可以使用它并将其布局传递给框架布局中的膨胀。 子活动“RecicpeActivity”使用数据绑定来设置其视图。 我正在做的是尝试将子活动的布局膨胀到基本活动中的框架布局“容器”中,但根本不考虑数据绑定,因为我有一个白色屏幕,即使我在调试时看到子活动的布局是框架布局的子活动 我试过两种方法: 1-我第一次尝试通过调用setContentView

我正在使用一个基本活动作为另一个活动“RecicpeActivity”的父活动,因为我已重写了基本活动中的方法setContentView,以便子活动可以使用它并将其布局传递给框架布局中的膨胀。 子活动“RecicpeActivity”使用数据绑定来设置其视图。 我正在做的是尝试将子活动的布局膨胀到基本活动中的框架布局“容器”中,但根本不考虑数据绑定,因为我有一个白色屏幕,即使我在调试时看到子活动的布局是框架布局的子活动

  • 我试过两种方法:
1-我第一次尝试通过调用setContentView传递子活动的布局,并将传递的布局扩展到基本活动中的框架布局

2-第二,我尝试在基本活动中使用数据绑定,但我认为这无关紧要

_儿童活动

public class RecipeActivity extends BaseActivity {
private ActivityRecipeBinding mBinding;
private static final String RECIPE_INTENT_KEY = "recipe key";
private ScrollView mScrollView;
private RecipeViewModel recipeViewModel;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    recipeViewModel = 
          ViewModelProviders.of(this).get(RecipeViewModel.class);
    mBinding = DataBindingUtil.inflate(
                getLayoutInflater(), 
                R.layout.activity_recipe, null, false);
    setContentView(R.layout.activity_recipe);

    // This method is implemented in the BaseActivity.
    showProgressBar(true);
    recipeViewModel.getRecipe().observe(this, new Observer<Recipe>() {
        @Override
        public void onChanged(Recipe recipe) {
            if (recipe != null){
                if (recipe.getRecipe_id().equals(
                    recipeViewModel.getRecipeId())){
                    mBinding.setRecipe(recipe);
                    mScrollView.setVisibility(View.VISIBLE);
                    showProgressBar(false);

                }
            }
        }
    });
    recipeViewModel.getRecipeById(getIncomingIntentRecipeId());
}

private String getIncomingIntentRecipeId(){
    if (getIntent().hasExtra(RECIPE_INTENT_KEY)){
        String recipe_id = getIntent().getStringExtra(RECIPE_INTENT_KEY);
        return recipe_id;
    }
    return null;
}
_儿童活动布局“活动配方”


充气后调用
layout.requestLayout()
,以便调整充气后所做的更改

getLayoutFlater().inflate(layoutResID,baseBinding.activityContent,true);
mRelativeLayout.requestLayout();
setContentView(baseBinding.getRoot());
公共void requestLayout()
当某些更改使此视图的布局无效时调用此函数。这将计划视图树的布局过程

如果您在调试时可以在视图heirarchy中看到子级,那么这应该可以解决问题

第2部分:绑定不起作用

您将视图膨胀两次,一次在子活动中,一次在基本活动中:

  mBinding = DataBindingUtil.inflate(
                getLayoutInflater(), 
                R.layout.activity_recipe, null, false);
    setContentView(R.layout.activity_recipe);
b为数据绑定充气一次,然后将布局id传递给setContentView,在那里再次充气:

 getLayoutInflater().inflate(layoutResID, frameLayout, true);

因此,数据绑定中的视图与添加到基本布局中的视图不同


创建一个重载版本的setContentView,该版本接受视图而不是id。

谢谢,我刚刚尝试过,但它不起作用,我实际上可以将膨胀的布局视为框架布局的子级,但数据绑定由于某种原因在其中不起作用。@MustafaShahoud我注意到它不起作用,我想你会明白为什么,你将子活动膨胀了两次这是绝对正确的,我想了一下,但是我第一次被迫膨胀,以便能够设置数据绑定变量,我不知道如何将mBinding膨胀到frameLayout。我可以在基本活动中扩展setContentView以接受两种类型的传递参数,然后我将能够传递mBinding.getRoot(),但如何将其膨胀到frameLayout??调用
mrRelativeLayout.addView(膨胀视图FromParameter,新的RelativeLayout.LayoutParams(LayoutParams.MATCH\u PARENT,LayoutParams.MATCH\u PARENT))
@Zohaib Amir谢谢兄弟,你让我度过了一个美好的夜晚,我接受了你的答案,并投了赞成票。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/base_relative_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

    </FrameLayout>

    <ProgressBar
        android:id="@+id/progress_bar"
        style="@style/Widget.AppCompat.ProgressBar"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_centerInParent="true"
        android:visibility="gone" />

</RelativeLayout>
public abstract class BaseActivity extends AppCompatActivity {
public ProgressBar mProgressBar;
public ActivityBaseBinding baseBinding;

@Override
public void setContentView(int layoutResID) {

      baseBinding = DataBindingUtil.inflate(
            getLayoutInflater(), R.layout.activity_base,  null, false);
      mProgressBar = baseBinding.progressBar;

    /**
     * True means layoutResID should be inflated and made a part of the 
                      parent frameLayout
     */
    getLayoutInflater().inflate(layoutResID, baseBinding.activityContent, 
                                                                      true);
    super.setContentView(baseBinding.getRoot());
}

public void showProgressBar(boolean visibility){
    mProgressBar.setVisibility(visibility ?
                       View.VISIBLE : View.INVISIBLE);
}
  mBinding = DataBindingUtil.inflate(
                getLayoutInflater(), 
                R.layout.activity_recipe, null, false);
    setContentView(R.layout.activity_recipe);
 getLayoutInflater().inflate(layoutResID, frameLayout, true);