SlideShare a Scribd company logo
1 of 43
Android Data Binding
public class AndroidVersion {



private final String mName;

private final String mNumber;



public AndroidVersion(String name, String number) {

mName = name;

mNumber = number;

}



public String getNumber() { return mNumber; }

public String getName() { return mName; }

}
<LinearLayout

style="@style/AndroidVersion.Root"

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>



<TextView

android:id="@+id/name"

style="@style/AndroidVersion.Name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

/>



<TextView

android:id="@+id/number"

style="@style/AndroidVersion.Number"

android:layout_width="match_parent"

android:layout_height="wrap_content"

/>



</LinearLayout>
public class VersionViewHolder extends RecyclerView.ViewHolder {



public final TextView name;

public final TextView number;



public VersionViewHolder(View itemView) {

super(itemView);

name = (TextView) itemView.findViewById(R.id.name);

number = (TextView) itemView.findViewById(R.id.number);

}



public void setVersion(AndroidVersion version) {

name.setText(version.getName());

number.setText(version.getNumber());

}

}
<layout xmlns:android="http://schemas.android.com/apk/res/android">



<data>

<variable name="version" type=“com.exposit.databindingsample.AndroidVersion" />

</data>



<LinearLayout

style="@style/AndroidVersion.Root"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>



<TextView

android:id="@+id/name"

style="@style/AndroidVersion.Name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@{version.name}"

/>



<TextView

android:id="@+id/number"

style="@style/AndroidVersion.Number"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@{version.number}"

/>



</LinearLayout>

</layout>
<layout xmlns:android="http://schemas.android.com/apk/res/android">



<data>

<variable name="version" type=“com.exposit.databindingsample.AndroidVersion" />

</data>



<LinearLayout

style="@style/AndroidVersion.Root"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>



<TextView

android:id="@+id/name"

style="@style/AndroidVersion.Name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@{version.name}"

/>



<TextView

android:id="@+id/number"

style="@style/AndroidVersion.Number"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@{version.number}"

/>



</LinearLayout>

</layout>
<layout xmlns:android="http://schemas.android.com/apk/res/android">



<data>

<variable name="version" type=“com.exposit.databindingsample.AndroidVersion" />

</data>



<LinearLayout

style="@style/AndroidVersion.Root"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>



<TextView

android:id="@+id/name"

style="@style/AndroidVersion.Name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@{version.name}"

/>



<TextView

android:id="@+id/number"

style="@style/AndroidVersion.Number"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@{version.number}"

/>



</LinearLayout>

</layout>
public class VersionBindingViewHolder extends RecyclerView.ViewHolder {



private final ItemVersionBinding mBinding;



public VersionBindingViewHolder(View itemView) {

super(itemView);

mBinding = ItemVersionBinding.bind(itemView);

}



public void setVersion(AndroidVersion version) {

mBinding.setVersion(version);

}

}
<data>
<layout xmlns:android="http://schemas.android.com/apk/res/android">



<data>

<import type="com.exposit.databindingsample.MyStringUtils" />

<variable name="version"

type="com.exposit.databindingsample.AndroidVersion" />

</data>



<TextView

android:id="@+id/name"

…

android:text="@{MyStringUtils.toLowerCase(version.name)}"

/>

</layout>
Type import


<data>

<import type="android.graphics.drawable.Drawable" />

<variable name="user" type="com.example.User" />

<variable name="image" type="Drawable" />

<variable name="note" type="String" />

</data>

Variables
<data>

<import type="com.exposit.databindingsample.View"

alias="CustomView" />

</data>
Type alias
Expression language
• Математические операторы
• Конкатенация строк
• Логические операторы
• Бинарные операторы
• Унарные операторы
• Битовые сдвиги
• Операторы сравнения
• instanceof
• Литералы: строковые, числовые, символьные, null
• Приведения типа
• Вызов методов и доступ к полям
• Доступ к элементам массива, List, Sparse List и Map через оператор []
• Тернарный оператор ?:
Поддерживаемые операторы
Неподдерживаемые
операторы
• this
• super
• new
• Явное выполнение типизированных методов

( Sample.<String>method() )
Null Coalescing Operator
android:text="@{user.displayName ?? user.lastName}"android:text="@{user.displayName ?? user.lastName}"
Null Coalescing Operator
android:text="@{user.displayName ?? user.lastName}"
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
Null safety
Код, сгенерированный библиотекой Data Binding,
автоматом проверяет на null все объекты и
предотвращает NullPoinerException.
Например, если в выражение @{version.name} version
является null, значение version.name будет являться его
значение по умолчанию - null. Если поле или метод будут
возвращать примитивный тип данных, то будет
использовано значение этого типа по умолчанию.
Ресурсы
android:padding="@{@dimen/largePadding}"
Dimension resources
android:text="@{@string/nameFormat(firstName, lastName)}"
String format resources
android:text="@{@plurals/banana(bananaCount)}"
Plurals resources
Type Normal Reference Expression Reference
String[] @array @stringArray
int[] @array @intArray
TypedArray @array @typedArray
Animator @animator @animator
StateListAnimator @animator @stateListAnimator
color (int) @color @color
ColorStateList @color @colorStateList
Обработка событий
public class VersionEventsHandler {



private final VersionBindingViewHolder mViewHolder;



public VersionEventsHandler(

VersionBindingViewHolder viewHolder) {

mViewHolder = viewHolder;

}



public void onVersionClicked(View view) {…}

}
public class VersionBindingViewHolder extends RecyclerView.ViewHolder {



private final ItemVersionBinding mBinding;



public VersionBindingViewHolder(View itemView) {

super(itemView);

mBinding = ItemVersionBinding.bind(itemView);

mBinding.setHandler(new VersionEventsHandler() {

public void onVersionClicked(View view) {…}

});

}



public void setVersion(@NonNull AndroidVersion version) {

mBinding.setVersion(version);

}

}
<layout xmlns:android="http://schemas.android.com/apk/res/android">



<data>

<variable name="version"

type=“com.exposit.databindingsample.AndroidVersion" />

<variable name=“handler"

type=“com.exposit.databindingsample.VersionEventsHandler" />

</data>



<View

…

android:onClick="@{handler.onVersionClicked}"

/>

</layout>
Data objects
Observable Object
public class AndroidVersion extends BaseObservable {



private String mName;

private String mNumber;



public AndroidVersion(String name, String number) {

mName = name;

mNumber = number;

}



@Bindable public String getNumber() { return mNumber; }



@Bindable public String getName() { return mName; }



public void setName(String name) {

mName = name;

notifyPropertyChanged(BR.name);

}



public void setNumber(String number) {

mNumber = number;

notifyPropertyChanged(BR.number);

}

}
Observable Fields
public class AndroidVersion {



public final ObservableField<String> name;

public final ObservableField<String> number;



public AndroidVersion(String name, String number) {

this.name = new ObservableField<>(name);

this.number = new ObservableField<>(number);

}

}
Observable Collections
• ObservableArrayList<T>
• ObservableMap<K, V>
• ObservableArrayMap<K, V>
Attribute setters
Automatic Setters
<layout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:bind="http://schemas.android.com/apk/res-auto"

>
<android.support.v4.widget.DrawerLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
bind:scrimColor="@{@color/scrim}"
bind:drawerListener=“@{activity.drawerListener}”/>
<layout/>
Renamed Setters
@BindingMethods({
@BindingMethod(
type = "android.widget.ImageView",
attribute = "android:tint",
method = "setImageTintList"),
})
Custom attributes
public class TypefaceTextView extends TextView {



public TypefaceTextView(Context context) { super(context);}



public TypefaceTextView(Context context, AttributeSet attrs) {

super(context, attrs);

init(context, attrs, 0);

}



public TypefaceTextView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context, attrs, defStyleAttr);

}



private void init(Context context, AttributeSet attrs, int defStyleAttr) {

TypedArray attrsArray =

context.obtainStyledAttributes(attrs, R.styleable.TypefaceTextView, defStyleAttr, 0);

String font = attrsArray.getString(R.styleable.TypefaceTextView_font);

attrsArray.recycle();



if (font != null) {

AssetManager assets = context.getAssets();

setTypeface(Typeface.createFromAsset(assets, "fonts/" + font + ".ttf"));

}

}

}
<LinearLayout

style="@style/AndroidVersion.Root"

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

…

>



<com.exposit.databindingsample.TypefaceTextView

…

app:font="Roboto-Medium"

/>



<com.exposit.databindingsample.TypefaceTextView

…

app:font="Roboto-Italic"

/>



</LinearLayout>
@BindingAdapter("bind:font")

public static void setFont(TextView textView, String font) {

AssetManager assets = textView.getContext().getAssets();

String fontPath = "fonts/" + font + ".ttf"

Typeface typeface = Typeface.createFromAsset(assets, fontPath);

textView.setTypeface(typeface);

}
<layout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:bind="http://schemas.android.com/apk/res-auto"

>



<LinearLayout>



<TextView

…

bind:font="@{"Roboto-Medium"}"

/>



<TextView

…

bind:font="@{`Roboto-Italic`}"

/>



</LinearLayout>

</layout>
@BindingAdapter({"bind:imageUrl", "bind:errorDrawable"})

public static void loadImage(

ImageView imageView, String imageUrl, Drawable error) {

Picasso.with(imageView.getContext())

.load(imageUrl)

.error(error)

.into(imageView);

}
<layout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:bind="http://schemas.android.com/apk/res-auto"

>



<ImageView

android:layout_width="match_parent"

android:layout_height="match_parent"

bind:imageUrl=“@{`http://exposit-ds.com/logo.png`}”

bind:errorDrawable="@{@drawable/error}"

/>



</layout>
<layout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:bind="http://schemas.android.com/apk/res-auto"

>



<ImageView

android:layout_width="match_parent"

android:layout_height="match_parent"

bind:errorDrawable="@{@color/error}"

bind:imageUrl=“@{`sample_image_url`}”

/>



</layout>
@BindingConversion

public static ColorDrawable colorToDrawable(int color) {

return new ColorDrawable(color);

}
Binding conversion

More Related Content

What's hot

Peek inside the fantastical Ukrainian Village home and studio of artists Jare...
Peek inside the fantastical Ukrainian Village home and studio of artists Jare...Peek inside the fantastical Ukrainian Village home and studio of artists Jare...
Peek inside the fantastical Ukrainian Village home and studio of artists Jare...irwinvifxcfesre
 
JavaScript Data Binding mit jQuery Mobile - MobileTech Conference Spring 2012
JavaScript Data Binding mit jQuery Mobile - MobileTech Conference Spring 2012JavaScript Data Binding mit jQuery Mobile - MobileTech Conference Spring 2012
JavaScript Data Binding mit jQuery Mobile - MobileTech Conference Spring 2012OPITZ CONSULTING Deutschland
 
Android Fast Track CRUD Android PHP MySql
Android Fast Track CRUD Android PHP MySqlAndroid Fast Track CRUD Android PHP MySql
Android Fast Track CRUD Android PHP MySqlAgus Haryanto
 
Belajar Android Studio CRUD Data Mahasiswa
Belajar Android Studio CRUD Data MahasiswaBelajar Android Studio CRUD Data Mahasiswa
Belajar Android Studio CRUD Data MahasiswaAgus Haryanto
 
Chief Keef's hologram can't catch a break, and it's a win for Keef
Chief Keef's hologram can't catch a break, and it's a win for KeefChief Keef's hologram can't catch a break, and it's a win for Keef
Chief Keef's hologram can't catch a break, and it's a win for Keefchicagonewsonlineradio
 
10 Programación Web con .NET y C#
10 Programación Web con .NET y C#10 Programación Web con .NET y C#
10 Programación Web con .NET y C#guidotic
 

What's hot (9)

Peek inside the fantastical Ukrainian Village home and studio of artists Jare...
Peek inside the fantastical Ukrainian Village home and studio of artists Jare...Peek inside the fantastical Ukrainian Village home and studio of artists Jare...
Peek inside the fantastical Ukrainian Village home and studio of artists Jare...
 
JavaScript Data Binding mit jQuery Mobile - MobileTech Conference Spring 2012
JavaScript Data Binding mit jQuery Mobile - MobileTech Conference Spring 2012JavaScript Data Binding mit jQuery Mobile - MobileTech Conference Spring 2012
JavaScript Data Binding mit jQuery Mobile - MobileTech Conference Spring 2012
 
Android Fast Track CRUD Android PHP MySql
Android Fast Track CRUD Android PHP MySqlAndroid Fast Track CRUD Android PHP MySql
Android Fast Track CRUD Android PHP MySql
 
Belajar Android Studio CRUD Data Mahasiswa
Belajar Android Studio CRUD Data MahasiswaBelajar Android Studio CRUD Data Mahasiswa
Belajar Android Studio CRUD Data Mahasiswa
 
jQuery for beginners
jQuery for beginnersjQuery for beginners
jQuery for beginners
 
Chief Keef's hologram can't catch a break, and it's a win for Keef
Chief Keef's hologram can't catch a break, and it's a win for KeefChief Keef's hologram can't catch a break, and it's a win for Keef
Chief Keef's hologram can't catch a break, and it's a win for Keef
 
Get more votes!
Get more votes!Get more votes!
Get more votes!
 
10 Programación Web con .NET y C#
10 Programación Web con .NET y C#10 Programación Web con .NET y C#
10 Programación Web con .NET y C#
 
Asp .net Jquery
Asp .net JqueryAsp .net Jquery
Asp .net Jquery
 

Viewers also liked

Deep dive into Android Data Binding
Deep dive into Android Data BindingDeep dive into Android Data Binding
Deep dive into Android Data BindingRadek Piekarz
 
كيف يفكر الأثرياء؟ نوفمبر 2015
كيف يفكر الأثرياء؟   نوفمبر 2015كيف يفكر الأثرياء؟   نوفمبر 2015
كيف يفكر الأثرياء؟ نوفمبر 2015Arwa Shafi
 
Programowanie aplikacji na apple watch
Programowanie aplikacji na apple watchProgramowanie aplikacji na apple watch
Programowanie aplikacji na apple watchThe Software House
 
Presentation on binary search, quick sort, merge sort and problems
Presentation on binary search, quick sort, merge sort  and problemsPresentation on binary search, quick sort, merge sort  and problems
Presentation on binary search, quick sort, merge sort and problemsSumita Das
 
Επίσκεψη στο Ρούπελ-Δημοτικό Σχολείο Νέου Σουλίου Σερρών
Επίσκεψη στο Ρούπελ-Δημοτικό Σχολείο Νέου Σουλίου ΣερρώνΕπίσκεψη στο Ρούπελ-Δημοτικό Σχολείο Νέου Σουλίου Σερρών
Επίσκεψη στο Ρούπελ-Δημοτικό Σχολείο Νέου Σουλίου Σερρώνvasipali
 
DOCKER ET DEVOPS : ADOPTER LES MEMES PRATIQUES SOUS DEVOPS ET LINUX
DOCKER ET DEVOPS : ADOPTER LES MEMES PRATIQUES SOUS DEVOPS ET LINUXDOCKER ET DEVOPS : ADOPTER LES MEMES PRATIQUES SOUS DEVOPS ET LINUX
DOCKER ET DEVOPS : ADOPTER LES MEMES PRATIQUES SOUS DEVOPS ET LINUXTREEPTIK
 
Mistral and StackStorm
Mistral and StackStormMistral and StackStorm
Mistral and StackStormDmitri Zimine
 
Continous delivery at docker age
Continous delivery at docker ageContinous delivery at docker age
Continous delivery at docker ageAdrien Blind
 
[243] turning data into value
[243] turning data into value[243] turning data into value
[243] turning data into valueNAVER D2
 
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[232] 수퍼컴퓨팅과 데이터 어낼리틱스[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[232] 수퍼컴퓨팅과 데이터 어낼리틱스NAVER D2
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no AndroidNelson Glauber Leal
 
Extending the Platform with Spring Boot and Cloud Foundry
Extending the Platform with Spring Boot and Cloud FoundryExtending the Platform with Spring Boot and Cloud Foundry
Extending the Platform with Spring Boot and Cloud FoundryKenny Bastani
 
DockerCon EU 2015: Stop Being Lazy and Test Your Software!
DockerCon EU 2015: Stop Being Lazy and Test Your Software!DockerCon EU 2015: Stop Being Lazy and Test Your Software!
DockerCon EU 2015: Stop Being Lazy and Test Your Software!Docker, Inc.
 
Reactive dashboard’s using apache spark
Reactive dashboard’s using apache sparkReactive dashboard’s using apache spark
Reactive dashboard’s using apache sparkRahul Kumar
 
Is Activity God? ~ The MVP Architecture ~
Is Activity God? ~ The MVP Architecture ~Is Activity God? ~ The MVP Architecture ~
Is Activity God? ~ The MVP Architecture ~Ken William
 

Viewers also liked (19)

Deep dive into Android Data Binding
Deep dive into Android Data BindingDeep dive into Android Data Binding
Deep dive into Android Data Binding
 
كيف يفكر الأثرياء؟ نوفمبر 2015
كيف يفكر الأثرياء؟   نوفمبر 2015كيف يفكر الأثرياء؟   نوفمبر 2015
كيف يفكر الأثرياء؟ نوفمبر 2015
 
Programowanie aplikacji na apple watch
Programowanie aplikacji na apple watchProgramowanie aplikacji na apple watch
Programowanie aplikacji na apple watch
 
Presentation on binary search, quick sort, merge sort and problems
Presentation on binary search, quick sort, merge sort  and problemsPresentation on binary search, quick sort, merge sort  and problems
Presentation on binary search, quick sort, merge sort and problems
 
Oral bac allemand les 4 notions 
Oral bac allemand  les 4 notions Oral bac allemand  les 4 notions 
Oral bac allemand les 4 notions 
 
Επίσκεψη στο Ρούπελ-Δημοτικό Σχολείο Νέου Σουλίου Σερρών
Επίσκεψη στο Ρούπελ-Δημοτικό Σχολείο Νέου Σουλίου ΣερρώνΕπίσκεψη στο Ρούπελ-Δημοτικό Σχολείο Νέου Σουλίου Σερρών
Επίσκεψη στο Ρούπελ-Δημοτικό Σχολείο Νέου Σουλίου Σερρών
 
كيف .. تقرأ كتابا ؟
كيف .. تقرأ كتابا ؟كيف .. تقرأ كتابا ؟
كيف .. تقرأ كتابا ؟
 
DOCKER ET DEVOPS : ADOPTER LES MEMES PRATIQUES SOUS DEVOPS ET LINUX
DOCKER ET DEVOPS : ADOPTER LES MEMES PRATIQUES SOUS DEVOPS ET LINUXDOCKER ET DEVOPS : ADOPTER LES MEMES PRATIQUES SOUS DEVOPS ET LINUX
DOCKER ET DEVOPS : ADOPTER LES MEMES PRATIQUES SOUS DEVOPS ET LINUX
 
Couchbase Day
Couchbase DayCouchbase Day
Couchbase Day
 
Simple Data Binding
Simple Data BindingSimple Data Binding
Simple Data Binding
 
Mistral and StackStorm
Mistral and StackStormMistral and StackStorm
Mistral and StackStorm
 
Continous delivery at docker age
Continous delivery at docker ageContinous delivery at docker age
Continous delivery at docker age
 
[243] turning data into value
[243] turning data into value[243] turning data into value
[243] turning data into value
 
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[232] 수퍼컴퓨팅과 데이터 어낼리틱스[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no Android
 
Extending the Platform with Spring Boot and Cloud Foundry
Extending the Platform with Spring Boot and Cloud FoundryExtending the Platform with Spring Boot and Cloud Foundry
Extending the Platform with Spring Boot and Cloud Foundry
 
DockerCon EU 2015: Stop Being Lazy and Test Your Software!
DockerCon EU 2015: Stop Being Lazy and Test Your Software!DockerCon EU 2015: Stop Being Lazy and Test Your Software!
DockerCon EU 2015: Stop Being Lazy and Test Your Software!
 
Reactive dashboard’s using apache spark
Reactive dashboard’s using apache sparkReactive dashboard’s using apache spark
Reactive dashboard’s using apache spark
 
Is Activity God? ~ The MVP Architecture ~
Is Activity God? ~ The MVP Architecture ~Is Activity God? ~ The MVP Architecture ~
Is Activity God? ~ The MVP Architecture ~
 

More from Kirill Rozov

Kotlin Coroutines. Flow is coming
Kotlin Coroutines. Flow is comingKotlin Coroutines. Flow is coming
Kotlin Coroutines. Flow is comingKirill Rozov
 
2 years without Java. Kotlin only
2 years without Java. Kotlin only2 years without Java. Kotlin only
2 years without Java. Kotlin onlyKirill Rozov
 
Почему Kotlin?
Почему Kotlin?Почему Kotlin?
Почему Kotlin?Kirill Rozov
 
KOIN for dependency Injection
KOIN for dependency InjectionKOIN for dependency Injection
KOIN for dependency InjectionKirill Rozov
 
ConstraintLayout. Fell the Power of constraints
ConstraintLayout. Fell the Power of constraintsConstraintLayout. Fell the Power of constraints
ConstraintLayout. Fell the Power of constraintsKirill Rozov
 
Kotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platformsKotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platformsKirill Rozov
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после JavaKirill Rozov
 
Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3Kirill Rozov
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kirill Rozov
 
Why Kotlin - Apalon Kotlin Sprint Part 1
Why Kotlin - Apalon Kotlin Sprint Part 1Why Kotlin - Apalon Kotlin Sprint Part 1
Why Kotlin - Apalon Kotlin Sprint Part 1Kirill Rozov
 
Тестирование на Android с Dagger 2
Тестирование на Android с Dagger 2Тестирование на Android с Dagger 2
Тестирование на Android с Dagger 2Kirill Rozov
 
Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)Kirill Rozov
 
What's new in Android O
What's new in Android OWhat's new in Android O
What's new in Android OKirill Rozov
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle IntroductionKirill Rozov
 
Kotlin для Android
Kotlin для AndroidKotlin для Android
Kotlin для AndroidKirill Rozov
 

More from Kirill Rozov (20)

Kotlin Coroutines. Flow is coming
Kotlin Coroutines. Flow is comingKotlin Coroutines. Flow is coming
Kotlin Coroutines. Flow is coming
 
2 years without Java. Kotlin only
2 years without Java. Kotlin only2 years without Java. Kotlin only
2 years without Java. Kotlin only
 
Почему Kotlin?
Почему Kotlin?Почему Kotlin?
Почему Kotlin?
 
KOIN for dependency Injection
KOIN for dependency InjectionKOIN for dependency Injection
KOIN for dependency Injection
 
Optimize APK size
Optimize APK sizeOptimize APK size
Optimize APK size
 
ConstraintLayout. Fell the Power of constraints
ConstraintLayout. Fell the Power of constraintsConstraintLayout. Fell the Power of constraints
ConstraintLayout. Fell the Power of constraints
 
Kotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platformsKotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platforms
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после Java
 
Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2
 
Why Kotlin - Apalon Kotlin Sprint Part 1
Why Kotlin - Apalon Kotlin Sprint Part 1Why Kotlin - Apalon Kotlin Sprint Part 1
Why Kotlin - Apalon Kotlin Sprint Part 1
 
Тестирование на Android с Dagger 2
Тестирование на Android с Dagger 2Тестирование на Android с Dagger 2
Тестирование на Android с Dagger 2
 
Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)
 
What's new in Android O
What's new in Android OWhat's new in Android O
What's new in Android O
 
Android service
Android serviceAndroid service
Android service
 
Effective Java
Effective JavaEffective Java
Effective Java
 
Dagger 2
Dagger 2Dagger 2
Dagger 2
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
REST
RESTREST
REST
 
Kotlin для Android
Kotlin для AndroidKotlin для Android
Kotlin для Android
 

Android Data Binding