Search for:

Einführung von Jetpack Compose in das bestehende Projekt von Ziv Kesten | Februar 2022

Erstellen Sie mit “Erinnern” eine erweiterbare Statusansicht.

Ziv Kastanie
Bild von Ziv Kesten

Betrachten wir zunächst einen Einzelfall des Objekts, das wir bauen.

  • Text, der den Untertitel des Artikels enthält.
  • Rechtspfeil-Symbol (das animiert wird, sich vertikal zu drehen, wenn wir ein Element erweitern).
@Composable
ExpandableListItem() {
Card(...) {
Row(...) {
TitleAndSubtitle(...)
Icon(...)
}
}
}

Card ein vom System geliefertes Verbundbauteil ist, kann dies einige Zeit in Anspruch nehmenelevation ich shape als Parameter, und wir können es mit a versorgenmodifier für alles andere, was wir brauchen.
Der Card ist ein Container für unser erweiterbares Listenelement, damit wir es versenden elevation und einigemodifiers :

  • padding() – Es gibt uns Platz von den Rändern.
  • clip(RoundedCornerShape(*.dp)) – wird die Karte der gelieferten beifügen RoundedCornerShape .
  • clickable() – ergibt ein Lambda, das wir später zur Abwechslung verwenden können Zustand zusammengesetzt
Card(
elevation = 4.dp,
modifier = Modifier
.fillMaxWidth()
.padding(start = 15.dp, top = 15.dp, end = 15.dp)
.clip(RoundedCornerShape(8.dp))
.clickable { // We will deal with the click event later }
)

Bei uns Card wir haben Row (Horizontales Äquivalent LineraLayout), die Titel und ein Symbol enthält.

Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth()
) {...}

U Row legen wir fest TitleAndSubtitle ich Icon die horizontal ausgerichtet werden.

Row(...) {
TitleAndSubtitle(
title = "Expandable item title",
subtitle = "There are more items below! 👇"
)
Icon(...)
}
@Composable
fun TitleAndSubtitle(
title: String,
subtitle: String
) {
Column(verticalArrangement = Arrangement.Center) {
Text(text = title)
Text(text = subtitle)
}
}

Der Icon ist ein zusammenbaubares System, wir geben es ihm imageVector die wir als Teil der kompositorischen Abhängigkeit erhalten, an align Modifikator und etwas Neues, das wir noch nicht gesehen haben … a graphicsLayer.

Icon(
imageVector = Icons.Default.ArrowDropDown,
modifier = Modifier
.align(CenterVertically)
.graphicsLayer(...)
)

Der graphicsLayer Modifikator

GraphicsLayer ist ein Modifikator, der zum Anwenden von Effekten auf Inhalte verwendet wird, z. B. Skalierung, Drehung, Deckkraft, Schatten und Beschneidung.
In unserem Fall möchten wir das Pfeilsymbol so drehen, dass sich der Pfeil nach oben dreht, wenn das Element erweitert wird.

Icon(
modifier = Modifier
.graphicsLayer(
rotationZ = animateFloatAsState(
if (expanded) 180f else 0f).value,
)
)

In Jetpack Compose zeigt das deklarative UI-Framework wieder nur Elemente, die ihre eigenen hatten Kondition geändert, wenn wir darüber sprechen Kondition Im Zusammenhang mit der Compose-Benutzeroberfläche beziehen wir uns normalerweise speziell auf einige Funktionsvariablen, die enthalten oder darstellen Kondition.

@Composable
ExpandableListItem() {
var expanded by remember { mutableStateOf(false) }
Card(modifier = Modifier.clickable { expanded = !expanded}) {
Row(...) {
TitleAndSubtitle(...)
Icon(...)
}
}
}

mutableStateOf

Wir nehmen die Initialen Kondition das Objekt, das ist falsch (extended = false) und als Standard übergeben mutableStateOf:

mutableStateOf ist eine reaktive Strömung, ähnlich LiveDate oder StateFlow und wird boolesche Werte ausgeben, wenn wir uns ändern erweitert Variable.

merken

Wir wickeln mutableStateOf tok ua remember blockieren, damit es bei allen Neuzusammenstellungen nicht vergessen wird, sonst wird das Kondition wird die Voreinstellung sein falsch jedes Mal ExpandableListItem namens.

Jetzt müssen wir am Ende unserer Komponente einen weiteren Abschnitt hinzufügen,

@Composable
ExpandableListItem() {
var expanded
Card(...) {
/// Wrap the row in a Column
Column {
Row(...) {
TitleAndSubtitle(...)
Icon(...)
}

// And add the extra items sections
Column {
ExtraItem(item = Item())
ExtraItem(item = Item())

}
}
}
}
data class Item (
val title: String,
val date: String
)
@Composable
fun ExtraItem(item: Item) {
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Text(text = item.title)
Text(text = item.date)
}
}
//// Extra items sections

Divider(modifier = Modifier.height(1.dp))
Column(modifier = Modifier.padding(...)) {

Spacer(modifier = Modifier.height(10.dp))
ExtraItem(item = Item())

Spacer(modifier = Modifier.height(10.dp))
Divider(modifier = Modifier.height(1.dp))
Spacer(modifier = Modifier.height(10.dp))

ExtraItem(item = Item())

Spacer(modifier = Modifier.height(10.dp))
Divider(modifier = Modifier.height(1.dp))
Spacer(modifier = Modifier.height(10.dp))

ExtraItem(item = Item())

}

Eine der wunderbarsten Komponenten, die die Abhängigkeit vom Kompilieren einer Benutzeroberfläche beinhaltet, ist AnimatedVisibility zusammensetzbar.

@Composable
fun ExpandableListItem() {
var expanded by remember { mutableStateOf(false) }
Card() {
Row() {
TitleAndSubtitle()
Icon()
}
AnimatedVisibility(visible = expanded) {
Column {
ExtraItem(item = Item())
ExtraItem(item = Item())
}
}
}
}

Der AnimationSpec speichert die Animationsspezifikation, wir können sie verwenden, um sie zu definieren Genuss, Dauer, Verzögerungen, und andere Spezifikationen im Zusammenhang mit der Anpassung von Animationen.
Wenn wir Animationen wie z erweitern ich reduzieren Animationen für unsere Benutzeroberfläche können wir als verwenden.

AnimatedVisibility(
visible = expanded,
enter = expandVertically(
animationSpec = tween(
durationMillis = 300, easing = FastOutLinearInEasing)
)
,
exit = shrinkVertically(
animationSpec = tween(
durationMillis = 300, easing = FastOutLinearInEasing)
)

)

Wir haben heute viel gelernt! Wir haben den Pfeil mit animiert graphicsLayer Modifikator, mit dem wir die Sichtbarkeit animiert haben AnimatedVisibilityund wir haben gelernt, wie man es benutzt Kondition in Jetpack Compose mit remember ich mutableStateOf.

Einführung in Jetpack DataStore von Simona Stojanovic Android-Entwickler Januar 2022

Simona Stojanovic

Datenspeicher ist eine Jetpack-Datenspeicherbibliothek, die eine sichere und konsistente Möglichkeit bietet, kleine Datenmengen wie Einstellungen oder Anwendungsstatus zu speichern. Es basiert auf Kotlin Korutine und Flow die eine asynchrone Datenspeicherung ermöglichen. Es zielt darauf ab, zu ersetzen SharedPreferences, weil es sicher ist und nicht blockiert. Es bietet zwei verschiedene Implementierungen: Proto-DataStoredas typisierte Objekte speichert (unterstützt von Protokollpuffer) ich DataStore-Einstellungen, die Schlüssel/Wert-Paare speichert. Machen wir weiter, wenn wir es einfach benutzen DataStoregilt dies für beide Implementierungen, sofern nicht anders angegeben.

Wir werden uns diesen Blogbeitrag genauer ansehen Datenspeicher – wie es funktioniert, welche Implementierungen es bietet und ihre individuellen Anwendungsfälle. Wir werden uns auch ansehen, welche Vorteile und Verbesserungen es bringt SharedPreferences und warum sich der DataStore dadurch lohnt.

Schauen wir uns einen direkten Vergleich zwischen an SharedPreferences und Datenspeicher:

Vergleich von DataStore-Implementierungen mit SharedPreferences

Asynchrone API

Synchronbetrieb

Es ist jedoch möglich, DataStore und synchronen Betrieb mit ein wenig Hilfe des Corutin-Builders zu kombinieren, wie wir später sehen werden.

Fehlerbehandlung

Sicherheitsstufe

Datenkonsistenz

Migrationsunterstützung

Einstellungen Datenspeicher liest und schreibt datenbasiert Schlüssel/Wert-Paare, ohne vorherige Definition der Regelung. Auch wenn das vielleicht ähnlich klingt SharedPreferences, denken Sie an alle oben genannten Verbesserungen, die der DataStore mit sich bringt. Lassen Sie sich nicht von ihrem Teilen täuschen.”Einstellungen„Bei der Benennung – sie haben nichts gemeinsam und kommen von zwei völlig getrennten APIs.

Proto Datenspeicher Geschäfte getippte Objektemit Unterstützung Protocol Buffers, bietet Typsicherheit und eliminiert die Notwendigkeit von Schlüsseln. Protobuffs sind schneller, kleiner, einfacher und weniger mehrdeutig als XML und andere ähnliche Datenformate. Wenn Sie sie noch nie benutzt haben, haben Sie keine Angst! Dies ist sehr einfach zu lernen. Obwohl der Proto DataStore erfordert, dass Sie einen neuen Serialisierungsmechanismus erlernen, sind wir von seinen Vorteilen besonders überzeugt Typ Sicherheites ist es wert.

Vergleich von DataStore-Implementierungen

Bei der Wahl zwischen den beiden müssen Sie Folgendes berücksichtigen:

  • Wenn Sie mit arbeiten Schlüssel/Wert-Paare zum Lesen und Schreiben von Daten, die Sie möchten schnell migrieren von SharedPreferences mit minimalen Änderungen, während Sie immer noch die Vorteile von DataStore-Verbesserungen nutzen und sich ohne Typsicherheitsprüfungen sicher genug fühlen, können Sie mit gehen DataStore-Einstellungen
  • Wenn Sie Protokollpuffer für den zusätzlichen Vorteil einer verbesserten Lesbarkeit lernen möchten, wenn Ihre Daten Arbeit erfordern komplexere Klassenwie Aufzählungen oder Listen, und die Sie haben möchten vollständige Sicherheit unterstützen, während Sie dies tun, können Sie versuchen Proto-DataStore

Wenn Sie mit arbeiten müssen komplexe Datensätze größer als ein paar 10 KB ist, ist es sehr wahrscheinlich, dass Sie es brauchen werden Teilaktualisierungen oder Referenzintegrität zwischen verschiedenen Datentabellen. In diesem Fall sollte der Einsatz erwogen werden Zimmer.

Wenn Sie jedoch mit arbeiten kleiner und einfacher Datensätzewie z. B. Anwendungseinstellungen oder Status, und daher keine Teilaktualisierungen oder Referenzintegrität erfordern, sollten Sie auswählen Datenspeicher.

So wählen Sie zwischen DataStore und Room

Einführung von Vivo-Tablets mit Snapdragon 870 und OLED-Bildschirm

In letzter Zeit ist der Markt für Android-Tablets rückläufig und die Menschen bewegen sich zum iPad. Aber während der Pandemie begannen die Menschen, von zu Hause aus zu arbeiten, und die Schüler lernten von zu Hause aus. Aufgrund dieser wachsenden Nachfrage nach Tablets haben Realme und Xiaomi ihre eigenen Android-Tablets auf den Markt gebracht und eine positive Resonanz erhalten.

Nach ihrem Erfolg gab Hu Baishan, Executive Vice President von Vivo, im August 2021 bekannt, dass sie an einer neuen Reihe von Tablets arbeiten. Das erste Tablet des Unternehmens wird laut Hu Baishan in der ersten Hälfte des Jahres 2022 auf den Markt kommen.

Das Vivo Tablet wird einen Snapdragon 870 haben

Laut Digital Chat Station hat ein beliebtes chinesisches Leck enthüllt, dass Vivo an einer Reihe von Tablets arbeitet, die über einen Snapdragon 870 und einen OLED-Bildschirm verfügen werden.

Er fand auch heraus, dass immer mehr Unternehmen mit ihrem neuen Tablet-Sortiment in den Tablet-Markt einsteigen. Laut einem Beitrag auf Weibo werden die neuen Vivo-Tablets auch ein Gaming-Tablet enthalten, das den Erfolg des iPad als Spielgerät beleuchtet.

Hier ist ein Screenshot der Ankündigung der Digital Chat Station auf Weibou:

Vivo Tablet - Digitale Chatstation

Ins Englische übersetzt:

Auch das Blue Factory Snapdragon 870 Tablet ist unterwegs. Im nächsten Jahr werden mehr Hersteller auf den Markt kommen, aus denen Sie wählen können, sowie Tablets mit einem fein positionierten Tintenbildschirm, kleine Gaming-Tablets, führende OLED-Tablets mit einem supergroßen Bildschirm usw. ~

~ Digitale Chat-Station, Weibo

Neben Tablets plant Vivo die Einführung eines neuen Gesundheitsprodukts. Mukul Sharma entdeckte kürzlich eine neue Marke auf der chinesischen CNIPA-Website, die ein neues Produkt namens TrueVivo vorstellte, das von Vivo stammt.

Das ist alles für jetzt. Wir werden Ihnen in Zukunft weitere Neuigkeiten zu Vivo-Tablets mitteilen. Folgen Sie uns weiter Twitter für die neuesten Nachrichten und Updates zu Android und Google. Wenn Sie Lecks oder ähnliches haben, teilen Sie uns dies unter [email protected] mit.

Verwandte Artikel:

  1. Vivo plant die Einführung einer VIVOCARD-ähnlichen Apple-Karte, einer eingetragenen Marke
  2. Vivo arbeitet an VivoFit Fitness Armband / Uhr, eingetragenes Warenzeichen
  3. Bald erhielt die Markteinführung des Vivo V2059 die Android-Zertifizierung