Hallo allerseits. In Erwartung des Beginns des Grundkurses zur Android-Entwicklung teilen wir weiterhin nützliches Material.
Bevor Sie diese Tipps lesen, sollten Sie die Kotlin-Dokumentation lesen und die Sprache selbst unter try.kotlinlang.org
lernen. Da diese Tipps speziell auf die Verwendung von Kotlin im Rahmen der Android-Entwicklung abzielen, sollten Sie auch Erfahrung mit dem Android SDK haben. Es ist auch ratsam, sich mit dem Kotlin-Plugin und der Verwendung von Kotlin mit Android Studio von JetBrains (Entwicklern von Kotlin) vertraut zu machen.
Lesen Sie den ersten TeilBeschreibung der Objekte
Beschreibungen von Objekten lassen nur Singleton zu, was nicht für eine Klasse mit der Fähigkeit zum Erstellen von Instanzen gehalten werden kann. Daher müssen Sie Singuletts nicht als Variablen einer statischen Klasse oder in der Application-Klasse speichern.
Wenn ich beispielsweise eine Utility-Klasse mit statischen Methoden für Threads habe und auf die gesamte Anwendung zugreifen möchte, können Sie dies tun:
package com.myapps.example.util import android.os.Handler import android.os.Looper
ThreadUtil kann später wie beim Aufrufen einer statischen Klassenmethode aufgerufen werden:
ThreadUtil.onMainThread(runnable)
Dies bedeutet, dass Sie das Verhalten einer statischen Klasse nicht mehr mit einem privaten Konstruktor simulieren müssen und nicht mehr herausfinden müssen, wo die Instanz gespeichert ist. Objekte sind in der Tat die ursprünglichen Elemente der Sprache. Nach demselben Prinzip erstellen wir Objekte anstelle innerer Klassen:
iewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) {} override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) { bindUser(position) } });
Beide tun im Wesentlichen dasselbe - sie erstellen eine Instanz der Klasse als deklariertes Objekt.
Unterstützende Objekte
Auf den ersten Blick hat Kotlin keine statischen Variablen und Methoden. In dieser Sprache gibt es keine derartigen Konzepte, aber es gibt ein Konzept von Hilfsobjekten. Sie sind Singleton-Objekte in einer Klasse, die Methoden und Variablen enthalten, auf die Sie statisch zugreifen können. Ein Companion-Objekt lässt bestimmte Konstanten und Methoden zu, ähnlich wie bei statischen Klassen in Java. Damit können Sie dem
newInstance- Snippet-Muster folgen.
Schauen Sie sich das Begleitobjekt in seiner einfachsten Form an:
class User { companion object { const val DEFAULT_USER_AGE = 30 } }
Unter Android verwenden wir normalerweise statische Methoden und Variablen, um statische Fabriken für Fragmente zu erstellen. Zum Beispiel:
class ViewUserActivity : AppCompatActivity() { companion object { const val KEY_USER = "user" fun intent(context: Context, user: User): Intent { val intent = Intent(context, ViewUserActivity::class.java) intent.putExtra(KEY_USER, user) return intent } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_cooking) val user = intent.getParcelableExtra<User>(KEY_USER)
Das Erstellen einer
Absicht ähnelt einer ähnlichen Aktion in Java:
val intent = ViewUserActivity.intent(context, user) startActivity(intent)
Dieses Muster ist gut, da es die Wahrscheinlichkeit verringert, dass
Intent oder
Fragment nicht über die Daten verfügt, die zum Anzeigen von benutzerdefinierten oder anderen Inhalten erforderlich sind. Companion-Objekte sind eine Möglichkeit, das statische Zugriffsformular in Kotlin beizubehalten, und sollten verwendet werden, um das Fehlen von Klassen auszugleichen.
Globale Konstanten
Mit Kotlin können Sie Konstanten definieren, die an einer Stelle der Anwendung sichtbar sind (falls zutreffend). Der Umfang der Konstanten sollte jedoch so weit wie möglich minimiert werden. Und in Situationen, in denen eine Region global sein soll, bietet Kotlin eine hervorragende Möglichkeit, dies zu tun, ohne eine konstante Klasse verwenden zu müssen. So etwas wie:
package com.myapps.example import android.support.annotation.StringDef
Dann können sie überall im Projekt als Konstanten verwendet werden:
import com.savvyapps.example.PRESENTATION_MODE_EDITING val currentPresentationMode = PRESENTATION_MODE_EDITING
Die Konstanten im Projekt sollten so klein wie möglich sein, um die Komplexität zu verringern. Wenn Sie einen Wert haben, der nur für eine benutzerdefinierte Klasse gilt, ist es am besten, ihn in ein Hilfsobjekt einzufügen.
Erweiterungen
Erweiterungen sind nützlich, weil Sie damit Klassenfunktionen hinzufügen können, ohne diese zu erben. Wie kann man beispielsweise einer
hideKeyboard()
wie
hideKeyboard()
eine Methode hinzufügen? Mit Erweiterungen können Sie dies ganz einfach tun:
fun Activity.hideKeyboard(): Boolean { val view = currentFocus view?.let { val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager return inputMethodManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS) } return false }
Erweiterungen sind insofern nützlich, als sie:
- Helfen Sie, die Lesbarkeit des Codes zu verbessern
- Sie müssen keine Dienstprogrammklassen und -methoden erstellen.
Sie können noch weiter gehen und die Architektur des Codes verbessern. Stellen Sie sich vor, Sie haben ein Grundmodell, z. B.
Article , das als Datenklasse betrachtet wird, die von der API aus einer Quelle extrahiert wurde:
class Article(val title: String, val numberOfViews: Int, val topic: String)
Es ist notwendig, die Relevanz des Artikels für den Benutzer basierend auf einer Formel zu bestimmen. Solltest du es direkt in die Artikelklasse setzen? Und wenn das Modell nur Daten aus der API enthalten soll, nichts weiter, können Erweiterungen wieder verwendet werden:
fun Article.isArticleRelevant(user: User): Boolean { return user.favoriteTopics.contains(topic) }
Dies ist derzeit eine einfache Möglichkeit, um zu überprüfen, ob ein Artikelthema in Ihrer Liste der Lieblingsthemen vorhanden ist.
Diese Logik kann variieren, je nachdem, wo Sie diese und andere Attribute des Benutzerverhaltens testen möchten. Da diese Logik zum Teil unabhängig vom
Artikelmodell unterstützt wird , können Sie sie je nach Zweck, Methode und Änderungsfähigkeit ändern.