Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DataBinding: How to use BaseActivity / How to use Abstraction

I am trying to add DataBinding to my app. In my app, I have a BaseActivity which has a Toolbar and a FrameLayout. FrameLayout is container for activities' which extend the BaseActivity. How can I add databinding to both my BaseActivity and the extending activities?

I'll share my code without DataBinding:

Here is my 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);
    }
}

Here is 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>

Here is the activity which extends BaseActivity: 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"));
    }
}

Okey, I add DataBinding to my BaseActivity.java like that:

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

But I am not sure how to add DataBinding to my extending activities in this scenerio. Could you help me out, please?

like image 916
Figen Güngör Avatar asked Oct 16 '16 22:10

Figen Güngör


1 Answers

Might be late for this question.

Your BaseActivity should looks like following.

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

Your MainActivity should looks like following.

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

Reference source code can be download from here.

Hope this helps you.

like image 199
Hiren Patel Avatar answered Sep 18 '22 22:09

Hiren Patel