Two-way data binding (雙向數據綁定)

前言 使用單向數據綁定可以在屬性上設置數值,並可設定對該屬性的變化作出反應的監聽器。如下 <CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@{viewmodel.rememberMe}" android:onCheckedChanged="@{viewmodel.rememberMeChanged}" /> 雙向數據綁定提供了此過程的捷徑。如下 <CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@={viewmodel.rememberMe}" /> 注意在 @={} 表示法中的 = 符號表示了同時接受資料變化以及監聽更新。 為了對數據的變化做出反應,可以讓佈局變量成為 Observable 的實現,通常是 BaseObservable,並使用 @Bindable 註釋,如下 public class LoginViewModel extends BaseObservable { // private Model data = ... @Bindable public Boolean getRememberMe() { return data.rememberMe; } public void setRememberMe(Boolean value) { // Avoids infinite loops. if (data.rememberMe...

Bind layout views to Architecture Components (綁定佈局到架構元件)

前言 AndroidX 函式庫包含架構元件(Architecture Components),可以使用它來設計健壯,可測試和可維護的應用程序。 Data Binding Library 可與架構元件無縫協作,進一步簡化 UI 的開發。 應用程序中的 layout 可以綁定到架構元件中的數據,這些數據可以幫助管理 UI 控制器生命週期並通知數據中的更改。 以下介紹如何將架構元件合併到應用程序,以進一步使用 Data Binding Library 的好處。   Use LiveData to notify the UI about data changes 可以使用 LiveData 物件作為數據綁定來源,以自動通知UI有關數據更改的訊息。更多的資訊可以參考 LiveData Overview 與實現 Observable 的物件(例如 observable fields)不同,LiveData 物件了解訂閱對象的生命週期。相關的好處可以參考 The advantages of using LiveData 在 Android Studio 3.1 或之後的版本可以使用 LiveData 取代 observable fields。 要將 LiveData 與綁定類別一起使用,需要指定生命週期所有者(lifecycle owner)以定義 LiveData 對象的範圍。如下,在綁定類別初始化之後指定了 Activity 本身為生命週期所有者。 class ViewModelActivity extends AppCompatActivity { @Override protected void onCreate(Bundle...

Binding adapters (綁定轉接器)

前言 Binding Adapter 主要用來呼叫適當方式來設定數值。一個例子為透過 setText 方法來設定屬性值,另一個例子為透過呼叫 setOnClickListener 方法來設定事件監聽器。 Data Binding Library 讓使用者指定調用方法來設定數值,客製化綁定邏輯,並使用適配器指定返回對象的類型。 Setting attribute values 每當綁定值發生更改時,綁定類別必須使用綁定表達式在視圖上調用 setter 方法。使用者可以允許 data binding library 自動決定哪個方法,顯式的聲明方法或提供自定義邏輯來選擇方法。   Automatic method selection 對於一個命名為 example 的屬性,data binding library 會嘗試尋找名稱為 setExample(arg) 的方法,其方法接受兼容的參數。 只有屬性的名稱和型別會被用於搜尋,屬性的名稱空間則不會被考慮。 例如,對於 android:text="@{user.name}" 表達式,data binding library 會尋找一個 setText(arg) 方法,該方法的參數(arg)的型別為 user.getName 方法所回傳的。例如,若 user.getName 方法回傳的型態為 String,則 data binding library 會尋找 setText 方法,其方法接受的參數型態為 String。若 user.getName 方法回傳的型態為 int,則 data binding library 會尋找 setText 方法,其方法接受的參數型態為 int。 表達式必須回傳正確的型態,如有必要可以進行轉型的動作。即使沒有屬性符合給定的名稱,數據綁定仍然工作。之後,可以使用數據綁定為任何...

Generated binding classes (產生綁定類別)

前言 Data Binding 會產生綁定類別(binding class),用來存取佈局變數(layout's variable)和視圖(View)。 以下描述了如何建立及客製化綁定類別。 綁定類別將佈局變量與佈局中的視圖連結起來,綁定類別的名稱和 package 可以自行定義。所有的綁定類別都繼承自 ViewDataBinding 類別。 每個 layout file 都會有一個對應的綁定類別。預設,類別的名稱會根據佈局文件的名稱,將其轉換為 Pascal 大小寫並添加 Binding。 若 layout 的名稱為 activity_main.xml,則對應的綁定類別為 ActivityMainBinding。 此類別包含佈局屬性(如user variable)到佈局視圖的所有綁定內容,並知道如何為綁定表達式指定值。   Create a binding object 在對佈局進行填充之後,應該快速的創建綁定對象(binding object),以確保在綁定到佈局中具有表達式的視圖之前不會修改視圖層次結構。 將對象綁定到佈局的最常用方法是使用綁定類別上的靜態方法。 可以透過使用綁定類別的 inflate 方法來擴展視圖層次結構並將對象綁定到該層次結構。如下 @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());...

Splash Activity

1.編輯 value/styles.xml 加入以下內容 <resources> ... <style name="AppTheme.Launcher"> <item name="android:windowBackground">@drawable/launch_screen</item> <!-- Optional, on Android 5+ you can modify the colorPrimaryDark color to match the windowBackground color for further branding--> <!-- <item name="colorPrimaryDark">@android:color/white</item> --> </style> ... </resources> 其中 @drawable/launch_screen 目前還沒有,下一步製作。 2.在 drawable 新增 launch_screen.xml,內容如下 <?xml version="1.0" encoding="utf-8"?> <!-- The android:opacity="opaque" line — this is critical in preventing a flash of black as your theme transitions. --> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"...

work with observable data objects (使用可觀察數據對象) (Data Binding)

前言 可觀察性(Observability)是指一個物件具有當其數據發生變化時通知其他元件的能力。 Data Binding Library讓物件,欄位,集合具有可被觀察的能力 任何的 POJO 都可以使用於 Data Binding,但修改該物件時並不會讓 UI 也跟著更新。 Data Binding 可為數據對象(data object)提供在其數據更改時通知其他對象(稱為偵聽器)的能力。 可觀察類別(observable class)有3種類型,objects,fields,collections 當上列3種可觀察類別的物件綁定了 UI,且物件的屬性(property)發生變化時,UI 將會自動更新。   Observable fields 因為去建立實作 Observable 介面的類別需要一些額外工作,因此若開發者僅有少量的屬性其實是不值得的,在這種情況下可以使用一般性可觀察類別,如下 ObservableBoolean ObservableByte ObservableChar ObservableShort ObservableInt ObservableLong ObservableFloat ObservableDouble ObservableParcelable         Observable fields 是具有單一欄位的自包含可觀察物件,使用方式為建立一個 public final 屬性,如下 private static class...

Layouts and binding expressions (佈局和綁定表達式)

Layouts and binding expressions 1.簡介 表達式語言(expression language)允許開發者編寫處理視圖調度事件的表達式。 Data Binding Library 會自動生成視圖與數據對象綁定所需的類別(綁定類別)(binding class)。 數據綁定佈局文件(data binding layout files)和一般佈局文件不同。基本上會以 layout 標籤開頭,後面跟著 data 元素和 view 的元件。這個 view 元件代表非綁定部分的根節點。如下範例所示 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android">    <data>        <variable name="user" type="com.example.User"/>    </data>    <LinearLayout        android:orientation="vertical"        android:layout_width="match_parent"        android:layout_height="match_parent">...

finaldb 和 Serializable 合併使用問題

問題描述: 若有個物件想透過 finalDB 儲存但又實作了 Serializable 介面。 當去存取該物件時,會出現"serialVersionUID has type long, got null" 相關問題。 發生問題的 class 如下 @Table(name = "GoodItem") public class GoodItem implements Serializable{ private static final long serialVersionUID = -6588468312284378785L; @Id private String id; ...   解決方法: 將 serialVersionUID 加上  @Transient 註解來解決,如下 @Table(name = "GoodItem") public class GoodItem implements Serializable{ @Transient private static final long serialVersionUID = -6588468312284378785L; @Id private String id; ...     Orignal From: finaldb 和 Serializable 合併使用問題...

Data Binding 前置準備

Data Binding 前置準備   版本限制 Data Binding 函式庫提供靈活性和廣泛的兼容性,目前可運行在 Android 4.0( API Level 14)以及更高的版本,以及建議使用最新的 Android Gradle 插件,Data Binding 可以運作在 1.5.0 及更高的版本   相依性 要啟用 Data Binding 函式庫,必須在 app module 的 build.gradle 檔案加入以下內容 android {     ...     dataBinding {         enabled = true     } }   Android Studio 支援特性 Android Studio 提供以下關於 Data Binding 的特性 1.語法高亮 2.標示語法錯誤 3.XML 代碼自動完成   新型資料綁定編譯器(data binding compiler) Android Gradle 3.1.0-alpha06 版本包含新型資料綁定編譯器,該編譯器能更快速的產生綁定類別(binding class)。 使用舊型資料綁定編譯器可能會產生多個錯誤訊息並提示找不到綁定類別,而使用新型資料綁定編譯器可避免這些狀況。 透過在 gradle.properties 檔案設定以下內容以啟用新型資料綁定編譯器 ...

Data Binding (Android Jetpack)

  什麼是 Data Binding Data Binding 是一個函式庫,允許您使用聲明性格式(而不是以編程方式)將佈局(layout)中的 UI 組件綁定到應用程序中的數據來源。   使用編程方式綁定 佈局元件(layout)通常會定義在 Activity 內並呼叫相關的 UI 框架方法。 如下透過呼叫 findViewById 找到 TextView並綁定到 viewModel 的 userName 屬性 TextView textView = findViewById(R.id.sample_text); textView.setText(viewModel.getUserName());     使用 Data Binding 綁定 以下則是使用 Data Binding 直接在佈局檔案指定文字給 widget,這種方式可以取代上面範例的 Java code <TextView     android:text="@{viewmodel.userName}" /> 透過在佈局檔案中綁定元件的方式可以移除許多需要在 Activity 呼叫的 UI 框架方法。讓  Activity 更簡潔並容易維護,也能改善效能,避免記憶體洩漏及 Null Pointer Exception。   Using the Data Binding Library 1.前置準備 2.佈局(layout)和綁定表達式(binding expressions) 3.使用可觀察資料物件(observable data objects)...

Lifecycle-Aware Components

什麼是 Lifecycle-aware Components? Lifecycle-ware components(生命週期感知元件)包含在 android.arch.lifecycle 套件中,基本上就是當元件(Activity or Service)的生命週期發生變化時,生命週期元件即會自動收到通知並觸發相對應的動作。   為什麼需要生命週期感知元件? 在此之前若開發者需要根據元件的生命週期執行相對應的動作時都必須寫在元件的對應方法中。最常見的例子為旋轉螢幕時需要儲存資料,不是寫在 onPause 方法就是寫在 onSaveInstanceState 方法。 但這種寫法最直接的缺點就是增加 Activity 的大小,讓 Activity 變得越來越大。 生命週期感知元件可以根據 Activity 或 Fragment 的當前生命週期狀態自動呼叫其行為。   Lifecycle Lifecycle 是一個類別,擁有關於另一個元件(Activity or Fragment)生命週期狀態的資訊。 Lifecycle 使用 2 個列舉來追蹤其相關連元件的生命週期狀態: 1.Event(事件) Event 透過 Framework 和 Lifecycle class 發送,Event 會對應於 Activity 或 Fragment 的回調事件(callback events)。 2.State(狀態) 相關連元件的當前狀態。 LifecycleOwner LifecycleOwner 為只有一個方法的介面,該方法必須回傳...

Android Architecture Components

什麼是 Android Architecture Components Android Architecture Components(AAC) 是函式庫的集合,可以幫助開發者寫出穩健,可測試,維護性高的 App。   AAC 包含了以下函式庫 Data Binding Lifecycles LiveData Navigation Paging 將可觀察資料綁定到UI元件 管理Activity和Fragment 生命週期 當資料改變時通知視圖(View) 處理App導航功能 循序的從數據來源讀取資料 Room ViewModel WorkManager     流暢存取SQLite 以生命週期方式管理UI相關資料 管理後台任務       也可以看到 AAC 涵蓋了App的整個架構主體。 基本上有以下4個要點 1. lifecycle-aware components 管理 Activity 或 Fragment 的生命週期。 可以避免記憶體洩漏(memory leaks),減少處理配置變更(configuration changes)的成本,更簡易的讀取資料到 UI。 2. LiveData 建立資料物件,當資料改變時會自動通知視圖(Views)。 可以套用 Observer Pattern 的觀念,把 LiveDate 當作 Subject,視圖當作 observer。 視圖會訂閱 LiveData,因此當...

Android Jetpack (噴射背包!!!) 簡介

什麼是 Android Jetpack? Android Jetpack 是一系列軟體元件的組合,透過應用這些元件可以幫助您寫出最佳實踐,避免樣板代碼並簡化複雜任務,讓開發者專注於需要關心的代碼。 Jetpack 包含在 androidx.* 的套件名稱,沒有和任何平台 API 綁定,它向後相容並可頻繁更新,代表開發者可以隨時使用最新最好的版本。   使用 Jetpack 的好處 1.加速開發 Jetpack 元件可單獨或組合使用,同時利用 Kotlin 提供的特性來加速開發 2.消除樣板代碼 Jetpack 特別用來管理複雜的行為,如後台任務,導航,生命週期。讓您專注在需要關心的部分 3.建立高品質,穩固的 App Jetpack 可以減少崩潰,減少記憶體洩漏並提供向後兼容性   Android Jetpack 元件組 主要有 4 個分類,每個分類都包含不同數量的元件,各個元件提供特定的功能,各為 Fundation , Architecture , Behavior , UI 1.Foundation 提供向後兼容,支援 Kotlin,測試相關功能 AppCompat Android KTX Multidex Test 為舊版 App 提供向後兼容性 支援 Kotlin 語言 支援多 DEX 檔案 Android 測試框架,提供單元測試和 UI測試   2.Architecture 提供建立穩固,可測試,可維護性高的 App Data Binding...

ViewModel 基本紀錄(Android Architecture Component)

Overview ViewModel 為 Android Architecture Component 其中一部分,主要的用途為以生命週期方式來儲存與管理UI相關數據。好處為當配置更改(螢幕旋轉)之後能夠予許數據繼續存在。 以架構來說通常是作為 MVVM 的 VM(ViewModel) 角色來呈現, 透過把和 View 不相關的邏輯提取出來放到 VM,一方面可以減輕 View 的職責,一方面提高其它模組內聚力,也讓測試更容易撰寫。 Dependency 參考官網 實作 ViewModel 實作方式非常簡單,只要繼承 ViewModel 即可。通常 ViewModel 會和 LiveData 同時使用,關於 LiveDate 請參考這裡 如同 Overview 提到的 ViewModel 可以在配置改變時自動保留數據,因此應該盡量把數據部分放到 ViewModel 而不是 Actvity 或 Fragment。 public class MyViewModel extends ViewModel { private static final String TAG = MyViewModel.class.getSimpleName(); } Note:通常會和 LiveData一起使用,但這裡為了方便說明,先不加入LiveData。 Using in Activity public class ViewModelMainActivity extends AppCompatActivity { private static final String TAG...

LiveData 基本紀錄(Android Architecture Component)

LiveData 為 Android Architecture Component 其中之一,主要用途為持有可觀察數據(observable data),並讓有註冊且為活躍狀態的觀察者自動收到更新。 若了解或實作過Observer Pattern(觀察者模式)會很容易了解,可以把LiveData看作Subject(主題)也就是資料的來源。對Subject有興趣的observers可以訂閱主題,訂閱完成後當主題內的數據發生變化時,observers便會自動收到通知。 基本上 Observer Pattern 是用來取代 polling 的解決方案。關於Observer Pattern 可以參考這篇 回過頭來,首先看看LiveData的OverView(這裡是官網介紹) 首先LiveData是一種擁有可觀察數據的類別(看字面不好懂,直接看實作吧) e.g., private MutableLiveData<String> mCurrentName = new MutableLiveData<String>(); 因為LiveData為abstract class,通常在實作上會以MutableLiveData(LiveData's subclass)取代LiveData。角括號可以傳入任何型別,包含Collections,list等等。 LiveData最大的特色為它具有生命週期感知(Lifecycle-aware)能力,該能力可以讓LiveData得知其他元件(Activity, Fragment, Service)的生命週期。 因此可以避免很多必須手動操作的情況,如螢幕旋轉時需要儲存數據,UI和數據之間的同步,memoey leak等等。 如何使用LiveData...

Gson 搭配 Gsonformat 基本使用紀錄

Gson 為 Google製作,可將JSON內容和java object互相轉換的library。 對我來說最大的用途就是可直接將Server回傳的json訊息直接轉換成java object,而不用再一一寫對應的 JsonObject。 而GsonFormat為 android studio 的外掛,用途是當你取得json內容之後,可以幫你產生對應的java object。 兩者搭配起來就可以方便的處理Server回傳訊息。 首先是Gson的部分: 這裡為Gson github連結,相關的安裝和使用都有介紹。 1.Gson Dependency 在 module 的 build.gradle 加入 dependencies { ... implementation 'com.google.code.gson:gson:2.8.5' } 2.Using in code 2-1. Json to java object 首先假設有個User 類別為對應的 java object public class User { private String name; private int age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } ...

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Affiliate Network Reviews