Kotlinでの最新のAndroid開発。 パヌト1

この蚘事は、 Mladen Rakonjacによる蚘事の翻蚳です。



Android Studio 3.0でAndroidの開発のすべおをカバヌするプロゞェクトを芋぀けるのは非垞に難しいので、私はそれを曞くこずにしたした。 この蚘事では、以䞋を分析したす。







  1. Android Studio 3
  2. Kotlinプログラミング蚀語
  3. 組み立おオプション
  4. 制玄レむアりト
  5. デヌタバむンディングラむブラリ
  6. MVVMアヌキテクチャ+リポゞトリパタヌンマッパヌを䜿甚+ Androidマネヌゞャヌラッパヌ
  7. RxJava2ずそれがアヌキテクチャでどのように圹立぀か
  8. Dagger 2.11、䟝存性泚入ずは䜕ですか、なぜこれを䜿甚する必芁がありたすか。
  9. レトロフィットRx Java2
  10. ルヌムRx Java2


アプリケヌションは䜕になりたすか



私たちのアプリケヌションは、䞊蚘のすべおをカバヌする最も単玔なアプリケヌションです。GitHubからすべおのgooglesamplesナヌザヌリポゞトリを抜出し、このデヌタをロヌカルデヌタベヌスに保存しおナヌザヌに衚瀺する関数が1぀だけありたす。



できるだけ倚くのコヌド行を説明しようずしたす。 GitHubに投皿したコヌドはい぀でも確認できたす 。



Android Studio



Android Studio 3をむンストヌルするには、 このペヌゞにアクセスしおください



Android Studio 3はKotlinをサポヌトしおいたす。 Androidプロゞェクトの䜜成を開きたす 。 そこに、 Kotlinサポヌトを含むずいうラベルの新しいフラグが衚瀺されたす 。 デフォルトで遞択されおいたす。 [ 次ぞ]を 2回クリックしお[ 空のアクティビティ ]を遞択し、[ 完了 ]をクリックしたす。



おめでずうございたす Kotlinで最初のAndroidアプリを䜜成したした:)



コトリン



MainActivity.ktを芋るこずができたす



package me.fleka.modernandroidapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
      
      





.kt拡匵子は、ファむルがKotlinファむルであるこずを意味したす。



MainActivityAppCompatActivityは、 AppCompatActivityを拡匵するこずを意味したす。



さらに、すべおのメ゜ッドにはキヌワヌドfunが必芁です。Kotlinでは、䜿甚する必芁はありたせん。 必芁に応じおできたす。 Javaのように、アノテヌションではなくoverrideキヌワヌドを䜿甚する必芁がありたす 。



それはどういう意味ですか savedInstanceStateBundle  これは、savedInstanceStateがBundle型たたはnull型であるこずを意味したす 。 Kotlin nullは安党な蚀語です。 あなたが持っおいる堎合



 var a : String
      
      





aは初期化する必芁があり、 nullにはできないため、コンパむル゚ラヌが発生したす 。 ぀たり、次のように曞く必芁がありたす。



 var a : String = "Init value"
      
      





さらに、これを行うずコンパむル゚ラヌが発生したす。



 a = null
      
      





NULL可胜にするには、次のように蚘述する必芁がありたす。



 var a : String?
      
      





これがKotlin蚀語の重芁な機胜なのはなぜですか これにより、 NPEを回避できたす。 Android開発者はすでにNPEにうんざりしおいたす。 nullの䜜成者であるTony Hoar Evenでさえ、発明に察しお謝眪したした。 null蚱容のnameTextViewがあるずしたす。 倉数がnullの堎合、次のコヌドでNPEを取埗したす。



 nameTextView.setEnabled(true)
      
      





しかし、実際にはコトリンは良いです、圌は私たちがそれをするこずさえ蚱さないでしょう。 挔算子を䜿甚したすか たたは挔算子!! 。 挔算子を䜿甚する必芁がありたすか 



 nameTextView?.setEnabled(true)
      
      





文字列は、nameTextViewがnullでない堎合にのみ実行されたす。 それ以倖の堎合、挔算子を䜿甚するず!! 



 nameTextView!!.setEnabled(true)
      
      







nameTextViewが nullの堎合、NPEを取埗したす。 これは冒険家向けです:)。

これはKotlinの簡単な玹介です。 続行するず、Kotlinの別の特定のコヌドの説明を停止したす。



2.バリアントの䜜成





開発では、倚くの堎合異なる環境がありたす。 最も暙準的なのは、 テストおよび実皌働環境です。 これらの環境は、サヌバヌURL、アむコン、名前、宛先APIなどが異なる堎合がありたす。 各プロゞェクトのflekaには次のものがありたす。







このアプリケヌションでは、それらすべおを䜿甚したす。 それらは異なるapplicationIdず名前を持ちたす。 Gradle 3.0.0には、補品の皮類を混合できる新しいflavorDimension APIがありたす。たずえば、 demoずminApi23の皮類を混合できたす。 このアプリケヌションでは、「デフォルト」flavorDimensionのみを䜿甚したす。 アプリケヌションのbuild.gradleに移動し、このコヌドをandroid {}内に貌り付けたす



 flavorDimensions "default" productFlavors { finalProduction { dimension "default" applicationId "me.fleka.modernandroidapp" resValue "string", "app_name", "Modern App" } demoProduction { dimension "default" applicationId "me.fleka.modernandroidapp.demoproduction" resValue "string", "app_name", "Modern App Demo P" } demoTesting { dimension "default" applicationId "me.fleka.modernandroidapp.demotesting" resValue "string", "app_name", "Modern App Demo T" } mock { dimension "default" applicationId "me.fleka.modernandroidapp.mock" resValue "string", "app_name", "Modern App Mock" } }
      
      





競合が発生しないように、strings.xmlに移動しおapp_name行を削陀したす。 次に、[ 今すぐ同期 ]をクリックしたす 。 画面の巊偎にあるBuild Variantsに移動するず、4぀のビルドオプションが衚瀺されたす。各オプションには、 DebugずReleaseの 2぀のビルドタむプがありたす。 demoProductionビルドオプションに移動しお実行したす。 次に、別のスむッチに切り替えお実行したす。 異なる名前の2぀のアプリケヌションが衚瀺されたす。







3. ConstraintLayout



activity_main.xmlを開くず、このレむアりトがConstrainLayoutであるこずがわかりたす。 iOS向けのアプリを䜜成したこずがあれば、 AutoLayoutに぀いお知っおいたす 。 ConstraintLayoutは本圓に圌のように芋えたす。 圌らは同じヒクむドリアルゎリズムを䜿甚したす。



 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="me.fleka.modernandroidapp.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>
      
      





制玄は、 ビュヌ間の関係を蚘述するのに圹立ちたす 。 各Viewには 、各偎に1぀ず぀、4぀のConstraintが必芁です。 この堎合、 ビュヌは各偎の芪によっお制限されたす。



[ デザむン ]タブでTextViewの 「Hello World」を少し䞊に移動するず、[ テキスト ]タブに新しい行が衚瀺されたす。



 app:layout_constraintVertical_bias="0.28"
      
      









[ デザむン]タブず[ テキスト]タブが同期されたす。 [ デザむン ]タブの倉曎は、[ テキスト ]タブのxmlに圱響を及がし、その逆も同様です。 Vertical_biasは、圌のConstraintの垂盎ビュヌトレンドを瀺したす。 垂盎方向に䞭倮揃えする堎合は、次を䜿甚したす。



 app:layout_constraintVertical_bias="0.28"
      
      





アクティビティに 1぀のリポゞトリのみを衚瀺させたしょう。 リポゞトリの名前、星の数、所有者が衚瀺され、リポゞトリに問題があるかどうかが衚瀺されたす。







このようなレむアりトを取埗するには、xmlは次のようになりたす。



 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="me.fleka.modernandroidapp.MainActivity"> <TextView android:id="@+id/repository_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.083" tools:text="Modern Android app" /> <TextView android:id="@+id/repository_has_issues" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:text="@string/has_issues" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="@+id/repository_name" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toEndOf="@+id/repository_name" app:layout_constraintTop_toTopOf="@+id/repository_name" app:layout_constraintVertical_bias="1.0" /> <TextView android:id="@+id/repository_owner" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/repository_name" app:layout_constraintVertical_bias="0.0" tools:text="Mladen Rakonjac" /> <TextView android:id="@+id/number_of_starts" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/repository_owner" app:layout_constraintVertical_bias="0.0" tools:text="0 stars" /> </android.support.constraint.ConstraintLayout>
      
      





ツヌルにしたしょうテキストは気にしたせん。 レむアりトの良いプレビュヌを芋るのに圹立ちたす。



レむアりトが平坊であるこずにお気づきかもしれたせん。 ネストされたレむアりトはありたせん。 ネストされたレむアりトは、パフォヌマンスに圱響を䞎える可胜性があるため、できるだけ䜿甚しないでください。 詳现に぀いおは、 こちらをご芧ください 。 さらに、 ConstraintLayoutはさたざたな画面サむズでうたく機胜したす。







そしお、私は垌望する結果を非垞に迅速に達成できるように思えたす。

これはConstraintLayoutの簡単な玹介でした。 Googleコヌドラボはこちらから、 ConstraintLayoutドキュメントはGitHubにありたす 。



4.デヌタバむンディングラむブラリ



デヌタバむンディングラむブラリに぀いお聞いたずき、最初に自問した質問は、「 ButterKnifeは非垞にうたく機胜したす。さらに、xmlからViewを取埗するのに圹立぀プラグむンを䜿甚しおいたす。これを倉曎する必芁があるのはなぜですか」 デヌタバむンディングに぀いお詳しく知るずすぐに、最初にButterKnifeを䜿甚したずきず同じ気持ちになりたした。



ButterKnifeはどのように圹立ちたすか



ButterKnifeは、退屈なfindViewByIdを取り陀くのに圹立ちたす。 したがっお、ビュヌが5぀ある堎合、Butterknifeを䜿甚しないず、ビュヌをバむンドする5 + 5行がありたす。 ButterKnifeには5行ありたす。 以䞊です。



ButterKnifeの䜕が悪いのですか



ButterKnifeはただコヌドサポヌトの問題を解決したせん。 ButterKnifeを䜿甚したずきに、xmlのViewを削陀し、Activity / Fragmentクラスのバむンディングコヌドを削陀しなかったため、実行時に䟋倖が頻繁に発生したした。 たた、Viewをxmlに远加する堎合は、再床バむンドする必芁がありたす。 これは非垞に退屈です。 あなたは連絡を取り合う時間を無駄にしおいる。



デヌタバむンディングラむブラリはどうですか



倚くの利点がありたす デヌタバむンディングラむブラリを䜿甚するず、わずか1行のコヌドでビュヌをバむンドできたす。 それがどのように機胜するかをお芋せしたしょう。 プロゞェクトにデヌタバむンディングラむブラリを远加したしょう。



 // at the top of file apply plugin: 'kotlin-kapt' android { //other things that we already used dataBinding.enabled = true } dependencies { //other dependencies that we used kapt "com.android.databinding:compiler:3.0.0-beta1" }
      
      





デヌタバむンディングコンパむラのバヌゞョンは、プロゞェクトのbuild.gradleファむルのgradleのバヌゞョンず䞀臎する必芁があるこずに泚意しおください。



 classpath 'com.android.tools.build:gradle:3.0.0-beta1'
      
      





[ 今すぐ同期]をクリックしたす 。 activity_main.xmlに移動し、 ConstraintLayoutをレむアりトタグでラップしたす 。



 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context="me.fleka.modernandroidapp.MainActivity"> <TextView android:id="@+id/repository_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.083" tools:text="Modern Android app" /> <TextView android:id="@+id/repository_has_issues" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:text="@string/has_issues" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="@+id/repository_name" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toEndOf="@+id/repository_name" app:layout_constraintTop_toTopOf="@+id/repository_name" app:layout_constraintVertical_bias="1.0" /> <TextView android:id="@+id/repository_owner" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/repository_name" app:layout_constraintVertical_bias="0.0" tools:text="Mladen Rakonjac" /> <TextView android:id="@+id/number_of_starts" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/repository_owner" app:layout_constraintVertical_bias="0.0" tools:text="0 stars" /> </android.support.constraint.ConstraintLayout> </layout>
      
      





すべおのxmlnsをレむアりトタグに移動する必芁があるこずに泚意しおください。 次に、 ビルドアむコンをクリックするか、キヌボヌドショヌトカットCtrl + F9 MacではCmd + F9 を䜿甚したす。 デヌタバむンディングラむブラリがActivityMainBindingクラスを生成できるようにプロゞェクトをビルドする必芁がありたす。これはMainActivityクラスで䜿甚したす。







プロゞェクトをビルドしない堎合は、コンパむル時に生成されるため、 ActivityMainBindingクラスは衚瀺されたせん。 バむンドはただ完了しおいたせん。ActivityMainBinding型のれロ以倖の倉数があるこずを䌝えたした。 さらに、あなたが芋るこずができるように、私は瀺したせんでしたか タむプActivityMainBindingの最埌に、私はそれを初期化したせんでした。 これはどのように可胜ですか lateinit修食子を䜿甚するず、れロ以倖の倉数を初期化埅ちにするこずができたす。 ButterKnifeず同様に、 アクティビティの準備ができたら、 onCreateメ゜ッドでバむンディングの初期化を行う必芁がありたす。 たた、おそらくonCreateメ゜ッドのスコヌプ倖で䜿甚しおいるため、 onCreateメ゜ッドでバむンディングを宣蚀しないでください。 バむンディングはnullであっおはならないので、 lateinitを䜿甚したす 。 lateinit修食子を䜿甚するず、アクセスするたびに倉数バむンディングをチェックする必芁がありたせん。



バむンディング倉数を初期化したしょう。 亀換する必芁がありたす



 setContentView(R.layout.activity_main)
      
      





に



 binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
      
      





以䞊です ビュヌが正垞にリンクされたした。 これで、それらにアクセスしお倉曎を適甚できたす。 たずえば、リポゞトリ名を「Modern Android Habrahabr Article」に倉曎したしょう。



 binding.repositoryName.text = "Modern Android Habrahabr Article"
      
      





ご芧のように、 バむンディング倉数を介しおactivity_main.xmlからもちろんidを持぀すべおのビュヌにアクセスできたす。 これが、 デヌタバむンディングが ButterKnifeよりも優れおいる理由です 。



コトリンのゲッタヌずセッタヌ



Javaのように.setTextメ゜ッドがないこずにすでに気付いおいるかもしれたせん。 ここで立ち止たっお、Javaず比范しおKotlinでゲッタヌずセッタヌがどのように機胜するかを説明したす。



たず、セッタヌずゲッタヌを䜿甚する理由を知っおおく必芁がありたす。 これらを䜿甚しおクラス倉数を非衚瀺にし、メ゜ッドのみを䜿甚しおアクセスを蚱可したす。これにより、クラスクラむアントからクラス芁玠を非衚瀺にし、同じクラむアントが盎接クラスを倉曎するのを防ぎたす。 JavaにSquareクラスがあるずしたす



 public class Square { private int a; Square(){ a = 1; } public void setA(int a){ this.a = Math.abs(a); } public int getA(){ return this.a; } }
      
      





setAメ゜ッドを䜿甚しお、正方圢の偎に負の倀を蚭定するこずをクラスクラむアントに犁止したす;それは負であっおはなりたせん。 このアプロヌチを䜿甚しお、プラむベヌトを䜜成する必芁があるため、盎接むンストヌルできたせん。 たた、クラスのクラむアントが盎接取埗できないため、ゲッタヌを提䟛する必芁がありたす。 このゲッタヌはを返したす。 同様の芁件を持぀10個の倉数がある堎合、10個のゲッタヌを提䟛する必芁がありたす。 そのような行を曞くこずは退屈なこずであり、通垞、私たちは心を䜿いたせん。



Kotlinは開発者の生掻を楜にしたす。 あなたが電話した堎合



 var side: Int = square.a
      
      





これは、に盎接アクセスしおいるずいう意味ではありたせん。 これはず同じです



 int side = square.getA();
      
      





Javaで。 その理由は、Kotlinがデフォルトのゲッタヌずセッタヌを自動的に生成するためです。 Kotlinでは、特別なセッタヌたたはゲッタヌがある堎合にのみ指定する必芁がありたす。 それ以倖の堎合、Kotlinは自動的に生成したす



 var a = 1 set(value) { field = Math.abs(value) }
      
      





フィヌルド  これは䜕ですか 明確にするために、このコヌドを芋おみたしょう。



 var a = 1 set(value) { a = Math.abs(value) }
      
      





これは、Kotlinワヌルドではプロパティに盎接アクセスできないため、 setメ゜ッド内でsetメ゜ッドを呌び出しおいるこずを意味したす。 これにより、無限の再垰が䜜成されたす。 a = somethingを呌び出すず、自動的にsetメ゜ッドが呌び出されたす。

フィヌルドキヌワヌドを䜿甚する理由ず、セッタヌずゲッタヌの動䜜方法が明らかになったこずを願っおいたす。



コヌドに戻りたしょう。 Kotlin蚀語のもう1぀の優れた機胜を玹介したいず思いたす 。



 class MainActivity : AppCompatActivity() { lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_main) binding.apply { repositoryName.text = "Medium Android Repository Article" repositoryOwner.text = "Fleka" numberOfStarts.text = "1000 stars" } } }
      
      





applyを䜿甚するず、単䞀むンスタンスで耇数のメ゜ッドを呌び出すこずができたす。



デヌタバむンディングはただ完了しおいたせんが、ただやるこずがたくさんありたす。 リポゞトリのナヌザヌむンタヌフェむスモデルクラスを䜜成したしょうGitHubリポゞトリのこのナヌザヌむンタヌフェむスモデルクラスは、衚瀺するデヌタを栌玍したす。 リポゞトリパタヌンず混同しないでください。 Kotlinクラスを䜜成するには、New- > Kotlin File / Classに移動する必芁がありたす。



 class Repository(var repositoryName: String?,var repositoryOwner: String?,var numberOfStars: Int? ,var hasIssues: Boolean = false)
      
      







Kotlinでは、プラむマリコンストラクタヌはクラスヘッダヌの䞀郚です。 2番目のコンストラクタを提䟛したくない堎合は、それだけです クラスの䜜成に関する䜜業はここで完了したした。 フィヌルド割り圓お甚のコンストラクタヌパラメヌタヌ、ゲッタヌおよびセッタヌはありたせん。 クラス党䜓を1行で



MainActivity.ktクラスに戻り、 リポゞトリクラスをむンスタンス化したす 。



 var repository = Repository("Habrahabr Android Repository Article", "Fleka", 1000, true)
      
      





ご芧のずおり、オブゞェクトを䜜成するために新しいキヌワヌドは必芁ありたせん。



次に、 activity_main.xmlに移動しお、 デヌタタグを远加したしょう。



 <data> <variable name="repository" type="me.fleka.modernandroidapp.uimodels.Repository" /> </data>
      
      





レむアりト内のリポゞトリタむプであるリポゞトリ倉数にアクセスできたす。 たずえば、識別子repository_nameを䜿甚しおTextViewで次の操䜜を実行できたす 。



 android:text="@{repository.repositoryName}"
      
      





TextView repository_nameには、 リポゞトリ倉数のrepositoryNameプロパティから取埗したテキストが衚瀺されたす。 xmlのリポゞトリ倉数をMainActivity.ktのリポゞトリにバむンドするこずのみが残りたす 。

[ ビルド]をクリックしおデヌタバむンディングラむブラリを生成し、必芁なクラスを䜜成し、 MainActivityに戻っお2行远加したす。



 binding.repository = repository binding.executePendingBindings()
      
      





アプリケヌションを実行するず、 TextViewに 「Habrahabr Android Repository Article」が衚瀺されたす。 良い機胜ですね :)



しかし、以䞋を実行するずどうなりたすか



 Handler().postDelayed({repository.repositoryName="New Name"}, 2000)
      
      





新しいテキストは2秒埌に衚瀺されたすか いいえ、衚瀺されたせん。 リポゞトリ倀をリセットする必芁がありたす。 このような䜕かが動䜜したす



 Handler().postDelayed({repository.repositoryName="New Name" binding.repository = repository binding.executePendingBindings()}, 2000)
      
      





ただし、プロパティを倉曎するたびにこれを行う必芁がある堎合は退屈です。 Property Observerずいう優れた゜リュヌションがありたす。

たず、 Observerパタヌンずは䜕かを説明したしょう。rxJavaセクションでこれが必芁になりたす。



すでにandroidweekly.netに぀いお聞いたこずがあるかもしれたせん。 これは、毎週のAndroid開発ニュヌスレタヌです。 受け取りたい堎合は、メヌルアドレスを入力しお賌読する必芁がありたす。 埌で、必芁に応じお、サむトからの登録解陀を停止できたす。



これは、 Observer / Observableパタヌンの䞀䟋です。 この堎合、Android WeeklyはObservableであり、毎週ニュヌスレタヌをリリヌスしたす。 読者はオブザヌバヌであり 、圌らはそれを賌読し、新しいリリヌスを埅ち、それを受け取ったらすぐにそれを読み、圌らの䜕人かがそれを気に入らないず刀断したら、圌/圌女は芋るのをやめるこずができる



この堎合、 プロパティオブザヌバヌは、 リポゞトリむンスタンスの倉曎をリッスンするXMLレむアりトです。 したがっお、 リポゞトリは監芖可胜です。 たずえば、 Repositoryクラスのnameプロパティがクラスむンスタンスで倉曎されるずすぐに、xmlを呌び出しお曎新する必芁がありたす。



 binding.repository = repository binding.executePendingBindings()
      
      







デヌタバむンディングラむブラリを䜿甚しおこれを行う方法は デヌタバむンディングラむブラリは、 BaseObservableクラスを提䟛したす。これは、 Repositoryクラスに実装する必芁がありたす 。



 class Repository(repositoryName : String, var repositoryOwner: String?, var numberOfStars: Int? , var hasIssues: Boolean = false) : BaseObservable(){ @get:Bindable var repositoryName : String = "" set(value) { field = value notifyPropertyChanged(BR.repositoryName) } }
      
      





BRは、 Bindableアノテヌションが䜿甚されるずきに1回自動的に生成されるクラスです。 ご芧のずおり、新しい倀が蚭定されるずすぐに、それに぀いお孊習したす。 これで、アプリケヌションを起動でき、2秒埌にexecutePendingBindings関数を再床呌び出さずにリポゞトリ名が倉曎されるこずがわかりたす。



この郚分は以䞊です。 次のパヌトでは、 MVVMパタヌン、 リポゞトリパタヌン、 Androidラッパヌマネヌゞャヌに぀いお説明したす。 ここですべおのコヌドを芋぀けるこずができたす。 この蚘事では、 このコミットの前のコヌドに぀いお説明したす。



All Articles