Upload
others
View
13
Download
1
Embed Size (px)
Citation preview
MVVM w AndroidKONWENCJA ORGANIZACJI PROJEKTU
I DATA BINDING LIBRARY
Składowe aplikacji
ActivityActivities stanowią „widoki” aplikacji. Składają się z pliku XML zawierającego definicję layout’u, oraz klasy JAVA implementującej zachowanie widoku
KomunikacjaDane <-> WidokDużą część Activity stanowi „gluecode” odpowiedzialny za przekazanie danych do / z widoku.
ProblemyOGROMNE KLASY ACTIVITY UTRUDNIONE TESTOWANIE JEDNOSTKOWE
Rozwiązanie –wzorzec MVVMPodział kodu Activity na 3 rodzaje klas:
• Widok (Activity wraz z XML) -„platform-specific”
• Model – „platform-independent”
• ViewModel – nie „platform-independent”
ViewModel można testować jednostkowo
Data Binding Library
Bardzo przyjemna biblioteka pozwalająca na ograniczenie widoków niemal wyłącznie do layout’ów XML.
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/image"
bind:imageBitmap="@{viewModel.thumbBitmap}"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/text"
android:layout_marginTop="5dp"
android:gravity="center"
android:textSize="12sp"
android:text="@{viewModel.title}"/>
Prosty bindingLAYOUT.XML VIEWMODEL.JAVA
private ObservableField<String> filePath;
private ObservableField<Bitmap> thumbBitmap;
private ObservableField<Bitmap> photoBitmap;
private ObservableField<String> title;
AkcjeLAYOUT.XML VIEWMODEL.JAVA
public void fabClicked(View v) {
access.takePicture();
}
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@drawable/ic_camera_white_48dp"
android:onClick="@{viewModel::fabClicked}"/>
Adaptery atrybutówLAYOUT.XML ADAPTERS.JAVA
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/photo_recycler"
android:scrollbars="vertical"
app:itemViewBinder="@{viewModel.itemViewBinder}"
app:items="@{viewModel.photos}" />
@BindingAdapter("items")
public static <T> void setItems(RecyclerView recyclerView, Collection<T>
items)
{
BindingRecyclerViewAdapter<T> adapter =
(BindingRecyclerViewAdapter<T>) recyclerView.getAdapter();
if (adapter != null)
{
adapter.setItems(items);
adapter.notifyDataSetChanged();
}
else
{
recyclerView.setTag(KEY_ITEMS, items);
}
}
KonwerteryLAYOUT.XML CONVERTERS.JAVA
<Viewandroid:background="@{isError ? @color/red : @color/white}"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
@BindingConversionpublic static ColorDrawable convertColorToDrawable(int color) {
return new ColorDrawable(color);}
Prezentacja na przykładzie