【问题标题】:DataBinding: How to use BaseActivity / How to use AbstractionDataBinding:如何使用 BaseActivity / 如何使用 Abstraction
【发布时间】:2016-10-16 22:37:39
【问题描述】:

我正在尝试将 DataBinding 添加到我的应用程序中。在我的应用程序中,我有一个 BaseActivity,它有一个 Toolbar 和一个 FrameLayout。 FrameLayout 是扩展 BaseActivity 的活动的容器。如何将数据绑定添加到我的 BaseActivity 和扩展活动?

我将在没有 DataBinding 的情况下分享我的代码:

这是我的 BaseActivity.java

public class BaseActivity extends AppCompatActivity {


    @Override
    public void setContentView(@LayoutRes int layoutResID) {

        LinearLayout container = (LinearLayout) getLayoutInflater().inflate(R.layout.activity_base, null);
        FrameLayout activityContent = (FrameLayout) container.findViewById(R.id.activityContent);
        getLayoutInflater().inflate(layoutResID, activityContent, true);

        super.setContentView(container);

        Toolbar toolbar = (Toolbar) container.findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem) {
        if (menuItem.getItemId() == android.R.id.home) {
            finish();
        }
        return super.onOptionsItemSelected(menuItem);
    }

    public void setTitle(String title) {
        getSupportActionBar().setTitle(title);
    }
}

这里是 activity_base.xml

<?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"           
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

        <include
            android:id="@+id/toolbarLayout"
            layout="@layout/toolbar" />

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

    </LinearLayout>
</layout>

这是扩展 BaseActivity 的 Activity:CardRecyclerViewActivity.java

public class CardRecyclerViewActivity extends BaseActivity {

    RecyclerView recyclerView;
    ReplikAdapter adapter;
    ArrayList<Replik> replikListesi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_card_recyclerview);
        replikListesiniDoldur();
        adapter = new ReplikAdapter(replikListesi, this, R.layout.item_card_replik);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setAdapter(adapter);
        setTitle(R.string.cardRecylerView);
    }

    public void replikListesiniDoldur() {
        replikListesi = new ArrayList<Replik>();
        replikListesi.add(new Replik(R.drawable.harvey1, "Ben ihtimallere oynamam. Adama oynarım.", "Harvey Specter"));
        replikListesi.add(new Replik(R.drawable.harvey2, "Avukatlık doktorluğa çok benzer, acıtana kadar bastırırsın ve böylece nereye bakman gerektiğini anlarsın.", "Harvey Specter"));
        replikListesi.add(new Replik(R.drawable.harvey3, "İşte aramızdaki fark bu; Sen küçük kaybetmek istiyorsun ben ise büyük kazanmak.", "Harvey Specter"));
        replikListesi.add(new Replik(R.drawable.harvey4, "Benim hayallerim yok, hedeflerim var.", "Harvey Specter"));
    }
}

好的,我像这样将 DataBinding 添加到我的 BaseActivity.java 中:

public class BaseActivity extends AppCompatActivity {

    @Override
    public void setContentView(@LayoutRes int layoutResID) {

        ActivityBaseBinding binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.activity_base, null, false);

        getLayoutInflater().inflate(layoutResID, binding.activityContent, true);

        super.setContentView(binding.getRoot());

        setSupportActionBar(binding.toolbarLayout.toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem) {
        if (menuItem.getItemId() == android.R.id.home) {
            finish();
        }
        return super.onOptionsItemSelected(menuItem);
    }

    public void setTitle(String title) {
        getSupportActionBar().setTitle(title);
    }
}

activity_base.xml 与 DataBinding:

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            android:id="@+id/toolbarLayout"
            layout="@layout/toolbar" />

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

    </LinearLayout>
</layout>

但我不确定如何在这个场景中将 DataBinding 添加到我的扩展活动中。请你帮帮我好吗?

【问题讨论】:

  • 你发现了吗?
  • 是的,确实如此。我将工具栏一一添加到每个活动中,并从 BaseActivity 中删除了布局部分。
  • @FigenGüngör,好问题。

标签: android abstract-class abstraction android-databinding


【解决方案1】:

这个问题可能迟到了。

您的 BaseActivity 应如下所示。

public abstract class BaseActivity<B extends ViewDataBinding, T extends BaseViewModel> extends AppCompatActivity {

    protected B dataBinding;
    protected T baseViewModel;

    protected void bindView(int layoutId) {
        dataBinding = DataBindingUtil.setContentView(this, layoutId);
    }

    @Override
    protected void onDestroy() {
        baseViewModel.detachView();
        super.onDestroy();
    }
}

您的 MainActivity 应如下所示。

public class MainActivity extends BaseActivity<ActivityMainBinding, MainActivityViewModel> implements MainActivityView, View.OnClickListener {

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

        bindView(R.layout.activity_main);

        baseViewModel = new MainActivityViewModel();
        baseViewModel.attachView(this);

        dataBinding.btnPerformOperation.setOnClickListener(this);

    }

    @Override
    public void OnDataLoad(String item) {
        dataBinding.setIsLoading(false);
        startActivity(new Intent(MainActivity.this, SecondActivity.class).putExtra("result", item));
    }

    @Override
    public void OnError(Throwable throwable) {

    }

    @Override
    public void onClick(View v) {
        dataBinding.setIsLoading(true);
        baseViewModel.loadNextData();
    }
}

参考源代码可以从here下载。

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    这个怎么样?

    BaseActivityViewModel.java

    public class BaseActivityViewModel {
      public void onClick() {
        Log.i("BaseActivityViewModel | onClick", "111111111111");
      }
    }
    

    activity_base.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
      <data>
    
        <variable
          name="model"
          type="kr.changhoonjin.textmvvmwithextend.BaseActivityViewModel"/>
      </data>
    
      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:onClick="@{()->model.onClick()}"
          android:text="base"/>
    
        <FrameLayout
          android:id="@+id/layout_container"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>
    
      </LinearLayout>
    </layout>
    

    BaseActivity.java

    public class BaseActivity extends AppCompatActivity {
      private ActivityBaseBinding binding;
    
      @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_base);
        binding.setModel(new BaseActivityViewModel());
      }
    
      protected <T extends ViewDataBinding> T putContentView(@LayoutRes int resId) {
        return DataBindingUtil.inflate(getLayoutInflater(), resId, binding.layoutContainer, true);
      }
    }
    

    MainActivityViewModel.java

    public class MainActivityViewModel {
      public void onClick2() {
        Log.i("MainActivityViewModel | onClick2", "2222222222222");
      }
    }
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
      <data>
    
        <variable
          name="model"
          type="kr.changhoonjin.textmvvmwithextend.MainActivityViewModel"/>
      </data>
    
      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Hello World!"/>
    
        <Button
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:onClick="@{()->model.onClick2()}"
          android:text="main"/>
    
      </LinearLayout>
    </layout>
    

    MainActivity.java

    public class MainActivity extends BaseActivity {
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = putContentView(R.layout.activity_main);
        binding.setModel(new MainActivityViewModel());
      }
    }
    

    【讨论】:

    • 好的解决方案拯救了我的一天
    【解决方案3】:

    这将与您在 BaseActivity 中所做的相同,而不是 inflate 只需使用 setContentView

    private ActivityCardRecyclerviewBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_card_recyclerview);
    }
    

    【讨论】:

    • 当我扩展 BaseActivity 并将数据绑定添加到扩展它的我的活动时,它给了我这个错误: 引起:java.lang.RuntimeException:view tag is not correct on view:null at com. figengungor.suits.databinding.ActivityCardRecyclerviewBinding.bind(ActivityCardRecyclerviewBinding.java:95)
    猜你喜欢
    • 2019-11-27
    • 2020-04-30
    • 1970-01-01
    • 2015-04-07
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    相关资源
    最近更新 更多