Codeer uw eerste Android-slice en houd gebruikers betrokken

Het harde werk is nog niet voorbij, alleen omdat uw app talloze downloads en positieve recensies heeft verzameld in de Google Play Store. Uw typische mobiele gebruiker heeft tientallen van apps die op hun apparaat zijn geïnstalleerd en waarbij steeds nieuwe apps worden uitgebracht, moet u hard werken om de interesse van uw publiek te behouden!

Zorg ervoor dat gebruikers terugkomen naar uw app beslissend naar het creëren van een stabiele, loyale gebruikersbasis. Als u bovendien inkomsten genereert met uw app, is de hoeveelheid tijd die mensen in uw app besteden, direct van invloed op het bedrag dat u verdient. Denk aan elke extra seconde als een andere gelegenheid om een ​​advertentie weer te geven of de gebruiker te verleiden om op een in te spatten -app aankoop!

Op de I / O van dit jaar introduceerde Google plakjes, een nieuwe functie die belooft gebruikers terug te brengen naar uw app door de functies en inhoud van uw app voor hen te plaatsen op het exacte moment waarop ze het meest nodig zijn. 

Met plakjes die een belangrijk hulpmiddel vormen voor het behouden van je publiek, is dit het perfecte moment om hands-on ervaring op te doen met deze opkomende Android-functie. Aan het einde van dit artikel hebt u een reeks segmenten gemaakt, van een eenvoudig segment dat een activiteit lanceert wanneer er wordt doorgetikt tot complexere segmenten bestaande uit pictogrammen, afbeeldingen, rasters en meerdere SliceActions

Slices: meer manieren waarop gebruikers van uw app kunnen genieten 

Net als widgets zijn segmenten stukjes inhoud die buiten de toepassingscontext worden weergegeven, waardoor de zichtbaarheid van uw app wordt vergroot en u meer mogelijkheden krijgt om uw publiek te betrekken. 

Segmenten hebben de potentie om de zichtbaarheid van uw app aanzienlijk te vergroten, waarbij Google belooft steun voor segmenten toe te voegen aan de gebieden waar veel Android-gebruikers veel tijd doorbrengen, waaronder Google Zoeken en de Google Assistent. Omdat ze deel uitmaken van Android Jetpack, zijn slices compatibel met Android 4.4 en hoger, wat betekent dat je slices 95% van alle Android-gebruikers kunnen bereiken. 

Segmenten hebben dus veel te bieden, maar hoe werken ze? 

Momenteel, als u een zoekopdracht uitvoert in de Google-app, kan Google u een relevante toepassing voorstellen die op uw apparaat is geïnstalleerd. Bijvoorbeeld, als u Facebook voor mobiel heeft geïnstalleerd, typ dan facebook zal een directe link naar de Facebook-app oproepen.

Slices nemen deze app nog een stap verder door te focussen op specifieke taken die de gebruiker wil uitvoeren binnen de applicaties die ze al hebben geïnstalleerd.

Laten we een voorbeeld bekijken: stel dat u een Book A Hotel-app heeft geïnstalleerd waarmee u naar een hotel kunt zoeken en een kamer kunt reserveren. Wanneer je typt Hotels in Londen bij Google kom je de gebruikelijke zoekresultaten tegen, plus een deel van de toepassing in het Boek een hotel. Dit segment beveelt een hotel in Londen aan en geeft informatie weer zoals de naam en het adres van het hotel, plus een SliceAction, in de vorm van een knop waarmee u een kamer rechtstreeks kunt reserveren via de gebruikersinterface van het segment (UI). 

Voor de gebruiker heeft dit segment eenvoudig toegang geboden tot de informatie en functies die ze op dat moment nodig hadden. Voor de ontwikkelaar heeft dit segment hen in staat gesteld om hun toepassing voor een gebruiker te krijgen op het exacte moment waarop zij de grootste kans hadden om ze opnieuw te activeren..

Hoe maak ik mijn eerste slice? 

Laten we beginnen met het maken van een eenvoudig segment dat, wanneer er op wordt getikt, onze applicaties zal starten Hoofdactiviteit.

Deze eenvoudige techniek maakt het mogelijk om elke taak direct vanuit de gebruikersinterface van een slice te starten. In ons Boek A Hotel-voorbeeld kunnen we de knop gewoon koppelen aan de gerelateerde app's BookRoomActivity, wat een eenvoudige maar effectieve manier zou zijn om het aantal schermen dat de gebruiker moet navigeren te verminderen om deze specifieke taak te voltooien. 

Maak een nieuw Android-project om aan de slag te gaan. U kunt de gewenste instellingen gebruiken, maar zorg ervoor dat u de Inclusief Kotlin-ondersteuning checkbox wanneer gevraagd. 

Nadat u uw project hebt gemaakt, opent u het bestand build.gradle en voegt u het toe slice-core en slice-builder afhankelijkheden:

afhankelijkheden implementatie 'androidx.appcompat: appcompat: 1.0.0-alpha3' implementatie 'androidx.slice: slice-core: 1.0.0-alpha3' implementatie 'androidx.slice: slice-builders: 1.0.0-alpha3' implementatie ' androidx.constraintlayout: constraintlayout: 1.1.0 'implementatie' org.jetbrains.kotlin: kotlin-stdlib-jdk7: $ kotlin_version "

De inhoud van uw app weergeven in Google Zoeken, met Slice-providers

Vervolgens moeten we een maken slice provider, Dit is het onderdeel dat verantwoordelijk is voor het weergeven van de inhoud van uw app buiten de toepassingscontext. 

U maakt een slice-provider met de segmentprogrammasjabloon van Android Studio:

  • kiezen nieuwe > anders > Slice Provider van de Android Studio-werkbalk. 
  • Voer de naam in MySliceProvider.
  • Stel de Brontaal naar Kotlin.
  • Klik Af hebben.
  • Open de MySliceProvider class, en je zou de volgende automatisch gegenereerde code moeten zien: 
import android.content.ContentResolver import android.content.Intent import android.net.Uri import androidx.slice.Slice import androidx.slice.SliceProvider import androidx.slice.builders.ListBuilder class MySliceProvider: SliceProvider () override fun onCreateSliceProvider () : Boolean return true override-fun onMapIntentToUri (intent: Intent?): Uri var uriBuilder: Uri.Builder = Uri.Builder (). Scheme (ContentResolver.SCHEME_CONTENT) if (intent == null) return uriBuilder.build () val data = intent.data if (data! = null && data.path! = null) val path = data.path.replace ("/", "") uriBuilder = uriBuilder.path (pad) val context = context if (context! = null) uriBuilder = uriBuilder.authority (context.getPackageName ()) retourneer uriBuilder.build () // Construeer de slice // override-fun onBindSlice (sliceUri: Uri): Slice? val context = getContext ()?: return null return if (sliceUri.path == "/") // Pas de segment // ListBuilder aan (context, sliceUri) .addRow it.setTitle ("URI found.")  .build () else ListBuilder (context, sliceUri) .addRow it.setTitle ("URI not found.") .build () // Abonneer u op een gegevensbron, indien nodig // negeer plezier opSlicePinned (sliceUri: Uri?)  // Voorkom geheugenlekken door u af te melden bij de gegevensbron en eventuele waarnemers te verwijderen // negeer plezier opSliceUpind (sliceUri: Uri?) 

Als u uw slice-provider maakt met nieuwe > anders > Slice Provider, dan voegt Android Studio ook de benodigde provider toe aan je Manifest: 

        

Deze invoer zorgt ervoor dat uw slice kan worden ontdekt door andere applicaties.  

Is uw cross-project synchronisatie mislukt?

Tot nu toe hebben we alleen code gebruikt die Android Studio automatisch heeft gegenereerd, maar uw project mogelijk wel nu al weiger te compileren! 

Bugs, ontbrekende functionaliteit en algeheel vreemd gedrag zijn slechts een deel van het plezier van het werken met vroege releases. Op het moment van schrijven zou het genereren van een slice-provider soms op onverklaarbare wijze een nieuwe set afhankelijkheden toevoegen aan uw project build.gradle het dossier. 

implementatie 'androidx.slice: slices-core: 1.0.0-alpha1' implementatie 'androidx.slice: slices-builders: 1.0.0-alpha1'

Deze afhankelijkheden zijn niet alleen overbodig, ze zijn ook fout. Hoewel het gemakkelijk te missen is, vergelijk: 

implementatie 'androidx.slice: slices-core: 1.0.0-alpha3'

Met de juiste:

implementatie 'androidx.slice: slice-core: 1.0.0-alpha1'

Een s kan het verschil betekenen tussen een functionerende applicatie en een project dat weigert te compileren. De kans is groot dat deze bug wordt aangepakt voordat de plakken officieel worden vrijgegeven, maar als Android Studio begint te klagen over onopgeloste afhankelijkheden, controleer dan uw build.gradle bestand om te zien of dit is gebeurd in uw project. 

Een slice bouwen: URI's, SliceActions, en Slice Layouts

Om de boilerplate-code van de slice-provider in een functionerend segment te veranderen, moeten we verschillende wijzigingen aanbrengen:

1. Definieer een URI

Elke slice heeft een unieke URI en het is de taak van de slice-provider om de toewijzing tussen deze URI en de bijbehorende slice te verzorgen. 

Apps die een segment kunnen weergeven, zijn bekend host applicaties. Telkens wanneer een host een segment moet weergeven, stuurt deze een bindingsverzoek naar de slice-provider met de URI van het segment waarnaar het zoekt. Uw slice-provider controleert vervolgens de URI en retourneert het juiste segment.

In het volgende fragment, de onBindSlice methode is het controleren van de / myURI pad en een segment retourneert dat a weergeeft Hallo Wereld bericht.

class MySliceProvider: SliceProvider () override fun onCreateSliceProvider (): Boolean return true onderdrukt plezier opBindSlice (sliceUri: Uri): Slice? return if (sliceUri.path == "/ myURI") ListBuilder (context, sliceUri, ListBuilder.INFINITY) .addRow it.setTitle ("Hello World") .build () else ...

2. Maak je slice interactief 

Terwijl jij kon maak een segment dat eenvoudig wat informatie weergeeft, als u wilt dat uw segment interactief is, dan moet u er een of meer maken SliceActions

EEN SliceAction kan bestaan ​​uit een titel, een pictogram en een PendingIntent. Je kunt ook markeren SliceActions zoals primaire acties, welke trigger wanneer de gebruiker ergens op de rij van dat segment tikt. 

3. Bouw de gebruikersinterface van de Slice  

U definieert de lay-out van een segment door een ListBuilder, een rij toevoegen en vervolgens items aan die rij toevoegen. Hier gebruik ik bijvoorbeeld ListBuilder en rij toevoegen een plak maken die bestaat uit een titel en een ondertitel: 

import android.net.Uri import androidx.slice.Slice import androidx.slice.SliceProvider import androidx.slice.builders.ListBuilder import androidx.slice.builders.ListBuilder.INFINITY class MySliceProvider: SliceProvider () override fun onCreateSliceProvider (): Boolean return true onderdrukt plezier opBindSlice (sliceUri: Uri): Slice? val path = sliceUri.path when (path) "/ launchMainActivity" -> return createSlice (sliceUri) return null fun createSlice (sliceUri: Uri): Slice return ListBuilder (context, sliceUri, INFINITY) .addRow it .apply setTitle ("Dit is een titel") setSubtitle ("Dit is een ondertitel") .build ()

U kunt een combinatie van verschillende inhoudstypen weergeven in dezelfde rij, zoals tekst, acties en pictogrammen. 

Bouw je eerste volledig werkende Android-slice 

Laten we dit nu allemaal toepassen op ons project en een segment maken waarmee onze toepassingen worden gestart Hoofdactiviteit wanneer getikt. 

Open de MySliceProvider klasse, en voeg het volgende toe: 

import android.app.PendingIntent import android.content.Intent import android.net.Uri import androidx.core.graphics.drawable.IconCompat import androidx.slice.Slice import androidx.slice.SliceProvider import androidx.slice.builders.ListBuilder import androidx .slice.builders.SliceAction // Uitbreiden van SliceProvider // class MySliceProvider: SliceProvider () // Initialiseer je slice-provider // override-fun onCreateSliceProvider (): Boolean return true // Bouw het segment // override-fun opBindSlice ( sliceUri: Uri): Slice? // Controleer het URI-pad // val path = sliceUri.path when (pad) // Definieer de URI van het segment; Ik gebruik 'launchMainActivity' // "/ launchMainActivity" -> return createSlice (sliceUri) return null fun createSlice (sliceUri: Uri): Slice val activityAction = createActivityAction () // Maak de ListBuilder, die we zullen gebruiken gebruik om rijen toe te voegen aan onze slice // val listBuilder = ListBuilder (context !!, sliceUri, ListBuilder.INFINITY) // Construeer de rijen met behulp van RowBuilder // val rowBuilder = ListBuilder.RowBuilder (listBuilder) // Stel de titeltekst in // .setTitle ("Open MainActivity.") // Stel de primaire actie van de rij in // .setPrimaryAction (activityAction) // Voeg de rij toe aan de ListBuilder // listBuilder.addRow (rowBuilder) // Bouw de lijst // return listBuilder.build () fun createActivityAction (): SliceAction val intent = Intent (context, MainActivity :: class.java) retourneer SliceAction (PendingIntent.getActivity (context, 0, intent, 0), IconCompat.createWithResource (context !!, R. drawable.ic_home), "Open MainActivity")

Uw slices testen: Slice Viewer installeren 

Als u uw segmenten op de proef wilt stellen, hebt u ten minste één toepassing nodig die segmenten kan weergeven. 

Plakjes zullen naar verluidt later dit jaar hun debuut maken in de Google-zoekopdracht, maar op het moment van schrijven moest deze functie nog worden uitgerold. Momenteel is de enige manier om segmenten te testen de installatie van de Slice Viewer-app van Google, die is ontworpen om te emuleren hoe segmenten uiteindelijk worden weergegeven in Google Zoeken.

Om Slice Viewer op een Android Virtual Device (AVD) te installeren:

  • Download de Slice Viewer-toepassing van Google.
  • Zorg ervoor dat uw AVD actief is.
  • Zoek het APK-bestand van de Slice Viewer en sleep het naar uw AVD.

Om Slice Viewer op een fysieke smartphone of tablet te installeren: 

  • Slice Viewer downloaden.
  • Zorg ervoor dat uw smartphone of tablet is aangesloten op uw ontwikkelmachine.
  • Verplaats de Slice Viewer APK naar die van uw computer Android / sdk / platform-gereedschappen map.
  • Open een opdrachtpromptvenster (Windows) of terminal (Mac). 
  • Verander directory (CD) zodat de opdrachtprompt of terminal naar uw map met Android / sdk / platform-tools verwijst, bijvoorbeeld, hier is mijn opdracht:
cd / Gebruikers / jessicathornsby / Bibliotheek / Android / sdk / platform-tools
  • Voer het commando uit door op te drukken invoeren toets op uw toetsenbord.
  • Gebruik de adb installeren commando om de APK naar je Android-apparaat te duwen:
./ adb installeer slice-viewer.apk

Een URI-run-configuratie maken 

Vervolgens moet u een run-configuratie maken die de unieke URI van uw slice doorgeeft aan uw AVD- of Android-apparaat. 

  • kiezen Rennen > Configuraties bewerken ... van de Android Studio-werkbalk.
  • Klik op de + knop en selecteer vervolgens Android-app.
  • Geef je hardloopconfiguratie een naam. ik gebruik sliceConfig
  • Open de module vervolgkeuzelijst en selecteer vervolgens app.
  • Open de Lancering vervolgkeuzelijst en selecteer vervolgens URL.
  • Voer de URL van uw slice in, in de indeling slice-gehalte: // package-naam / slice-URL. De URL van mijn slice is bijvoorbeeld: slice-gehalte: //com.jessicathornsby.kotlinslices/launchMainActivity.
  • Klik OK.
  • kiezen Rennen > Voer sliceConfig uit via de Android Studio-werkbalk en selecteer vervolgens uw Android-apparaat.

De eerste keer dat Slice Viewer probeert uw segment weer te geven, vraagt ​​het toestemming om toegang te krijgen tot de unieke URI van uw slice. Tik Toestaan en navigeer door het permissiedialoogvenster en uw segment moet op het scherm verschijnen.

Om te communiceren met de SliceAction, Klik op de Open MainActivity knop, en het segment antwoordt door uw applicaties te starten Hoofdactiviteit

Haal meer uit je schijfjes: een seconde toevoegen SliceAction 

Waarom zou je jezelf beperken tot één SliceAction, wanneer je kunt hebben meerdere SliceActions? In dit gedeelte gaan we er twee implementeren SliceActions, waar elke actie een andere start Activiteit. Ik ga ook een paar nieuwe UI-elementen introduceren, door een ondertitel toe te voegen en enkele einde items naar onze slice. 

Maak een SecondActivity

Laten we de installatie uit de weg ruimen en een seconde maken Activiteit dat is onze tweede SliceAction kan linken naar. 

Selecteer eerst nieuwe > Kotlin-bestand / klasse van de Android Studio-werkbalk. Open in het nieuwe dialoogvenster de Soort dropdown en selecteer Klasse. Geef deze les een naam SecondActivity, en klik vervolgens op OK

Open nu je SecondActivity klasse en voeg het volgende toe:

import androidx.appcompat.app.AppCompatActivity import android.os.Bundle class SecondActivity: AppCompatActivity () override fun onCreate (savedInstanceState: Bundle?) super.onCreate (savedInstanceState) setContentView (R.layout.activity_second)

Selecteer vervolgens nieuwe > Android-bronbestand van de Android Studio-werkbalk. Open in het volgende venster de Resource type dropdown, en selecteer lay-out. Geef dit bestand een naam activity_second, en klik OK

Open nu dit layoutbestand en voeg de volgende code toe:

 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 =". MainActivity ">  

Open het Manifest van je project en verklaar dit SecondActivity:

Complexere gebruikersinterfaces bouwen: Items voor eindstukken 

Einditems kunnen een tijdstempel, een afbeelding of een zijn SliceAction, maar zoals de naam doet vermoeden, verschijnen ze altijd aan het einde van een rij. U kunt meerdere einditems toevoegen aan één rij, hoewel er, afhankelijk van de beschikbare ruimte, geen garantie is dat al uw einditems aan de gebruiker worden weergegeven. 

We zullen onze maken SliceActions als pictogrammen, dus u moet twee nieuwe tekstrappen toevoegen aan uw project:

  • kiezen nieuwe > Image Asset van de Android Studio-werkbalk.
  • Klik op de kleine Clip art knop (dit toont standaard een afbeelding van een Android).
  • Selecteer het pictogram dat u voor uw wilt gebruiken Start MainActivity einde item. Ik gebruik de Huis icoon.
  • Geef dit pictogram de naam ic_home, en klik vervolgens op volgende.
  • Lees de informatie op het scherm en als u graag verder wilt gaan, klikt u op Af hebben.

Herhaal de bovenstaande stappen om een ​​pictogram voor uw te maken Start SecondActivity plak actie. Voor mijn tweede eindproduct gebruik ik de telefoontje pictogram en benoemen ic_call.

De tweede SliceAction maken

We zijn nu klaar om een ​​seconde toe te voegen SliceAction naar de MySliceProvider klasse: 

import android.app.PendingIntent import android.content.Intent import android.net.Uri import androidx.core.graphics.drawable.IconCompat import androidx.slice.Slice import androidx.slice.SliceProvider import androidx.slice.builders.ListBuilder import androidx .slice.builders.SliceAction class MySliceProvider: SliceProvider () override fun onCreateSliceProvider (): Boolean return true override fun onBindSlice (sliceUri: Uri): Slice? val path = sliceUri.path when (path) "/ launchMainActivity" -> return createSlice (sliceUri) return null fun createSlice (sliceUri: Uri): Slice val activityAction = createActivityAction () IconCompat.createWithResource (context !! , R.drawable.ic_home) .toIcon () val activityAction2 = createSecondActivityAction () IconCompat.createWithResource (context !!, R.drawable.ic_call) .toIcon () // Constructeer de parent builder // val listBuilder = ListBuilder (context! !, sliceUri) // Bouw de builder voor de rij // val myRow = ListBuilder.RowBuilder (listBuilder) .setTitle ("Start MainActivity.") .setSubtitle ("Dit is een ondertitel") // Voeg de acties toe die we ' Ik gebruik als einditems // myRow.addEndItem (activityAction) myRow.addEndItem (activityAction2) // Voeg de rij toe aan de bovenliggende builder // listBuilder.addRow (myRow) // Bouw de slice // return listBuilder.build ()  fun createActivityAction (): SliceAction val intent = Intent (context, MainActivity :: class.java) retourneert SliceAction (PendingIntent.getActivity ( context, 0, intent, 0), IconCompat.createWithResource (context !!, R.drawable.ic_home) .toIcon (), "Start MainActivity") fun createSecondActivityAction (): SliceAction val intent = Intent (context, SecondActivity: : class.java) retourneer SliceAction (PendingIntent.getActivity (context, 0, intent, 0), IconCompat.createWithResource (context !!, R.drawable.ic_call) .toIcon (), "Launch SecondActivity")

Omdat we de URI niet hebben gewijzigd, hoeven we geen nieuwe configuratie van de run te maken, wat betekent dat het testen van dit segment net zo eenvoudig is als het selecteren Rennen > sliceConfig van de Android Studio-werkbalk. 

Je kunt dit project downloaden van de tutorial GitHub repo. 

Multimedia-slices: rasterlay-outs maken

Tot nu toe hebben we al onze segmenten geconstrueerd met alleen rijen, maar u kunt ook segmenten maken met behulp van rooster rijen en cellen. 

In deze laatste sectie gaan we een segment maken dat bestaat uit een titel, een ondertitel en een enkele rij verdeeld in drie cellen. Elke cel heeft een eigen titel, een hoofdtekst en een afbeelding en elke cel voert een unieke actie uit wanneer erop wordt getikt. 

Als u uw segment in een raster wilt opmaken, moet u: 

  • Implementeer een ListBuilder.
  • Voeg een rasterrij toe aan de ListBuilder, gebruik makend van addGridRow
  • Cellen toevoegen aan de rij met behulp van addCell. Elke rij kan maximaal vijf cellen weergeven.

U kunt vervolgens inhoud aan elke cel toevoegen, zoals: 

  • Een titel, die u toevoegt met addTitleText.
  • Hoofdtekst, gebruiken Voeg tekst toe.
  • Afbeeldingen die u maakt met Voeg afbeelding toe. Elke celafbeelding moet een van de volgende kenmerken hebben: LARGE_IMAGE, small_image, of ICON_IMAGE
  • Een inhoudsintentie, die ongeveer gelijk is aan a SliceAction. Om dit voorbeeld duidelijk te houden, tikt u op elke cel om een ​​artikel in de standaardbrowser van het apparaat te laden, maar als u een meer authentieke plakervaring wilt, kunt u de setContentIntent code. 

Ik zal enkele afbeeldingen in mijn raster opnemen, dus u moet ten minste één aantrekbaar toevoegen aan uw project. Ik gebruik het Kotlin-logo, maar je kunt elke afbeelding pakken en deze in je project laten vallen Tekenbaar map. 

Nu bent u klaar om de. Te openen MySliceProvider klasse en bouw je rooster: 

import android.app.PendingIntent import android.content.Context import android.content.Intent import android.net.Uri import androidx.core.graphics.drawable.IconCompat import androidx.slice.Slice import androidx.slice.SliceProvider import androidx.slice .builders.ListBuilder-klasse MySliceProvider: SliceProvider () override fun onCreateSliceProvider (): Boolean return true override-fun onBindSlice (sliceUri: Uri): Slice? val path = sliceUri.path when (path) "/ launchMainActivity" -> return createSliceWithGridRow (sliceUri) return null fun createSliceWithGridRow (sliceUri: Uri): Slice return ListBuilder (context, sliceUri, ListBuilder.INFINITY) .setHeader it.apply setTitle ("Wil je Kotlin voor Android leren leren?") setSubtitle ("Bekijk deze artikelen!") // Voeg een rasterrij toe aan de lijstbouwer // .addGridRow it.apply / / Voeg een cel toe aan de rij // addCell it.apply // Voeg inhoud toe aan uw cel // addTitleText ("Java vs. Kotlin") addText ("Deel 1") addImage (IconCompat.createWithResource (context, R. drawable.kotlin), ListBuilder.LARGE_IMAGE) // Geef de intentie op die moet worden geactiveerd wanneer de gebruiker interactie heeft met deze cel // .setContentIntent (loadArticlePendingIntent (context, "https://code.tutsplus.com/articles/java-vs- kotlin-should-you-be-using-kotlin-for-android-ontwikkeling ...) addCell it.apply addTitleText ("Codering in Kotlin") addText ("Part 2") addImage (IconCompat.createWithResourc e (context, R.drawable.kotlin), ListBuilder.LARGE_IMAGE) .setContentIntent (loadArticlePendingIntent (context, "https://code.tutsplus.com/tutorials/start-developing-android-apps-with-kotlin-part-1 --cms-27827? _ga = ...) addCell it.apply addTitleText ("Lambdas & NPE") addText ("Part 3") addImage (IconCompat.createWithResource (context, R.drawable.kotlin), ListBuilder. LARGE_IMAGE) .setContentIntent (loadArticlePendingIntent (context, "https://code.tutsplus.com/articles/coding-functional-android-apps-in-kotlin-lambdas-null-safety-more...) .build ( ) private fun loadArticlePendingIntent (context: Context, url: String) = PendingIntent.getActivity (context, 0, Intent (Intent.ACTION_VIEW) .apply data = Uri.parse (url), 0)

Je kunt de volledige code voor dit project vinden in onze GitHub-repo.

Voer deze app uit op uw AVD of fysieke Android-apparaat en probeer interactie te hebben met elk item in het raster. Elke cel moet linken naar een ander artikel.

Zorg ervoor dat uw slice er goed uitziet, ongeacht de hosttoepassing 

De manier waarop de inhoud van uw slice wordt weergegeven, kan variëren, afhankelijk van de mode de hosttoepassing is geconfigureerd voor. Om ervoor te zorgen dat uw segmenten er goed uitzien en correct werken, ongeacht de hosttoepassing, moet u uw slices testen in alle verschillende slice-modi.

Omdat onze rastergrootte aanzienlijk meer inhoud heeft dan de vorige plakken, is dit de beste kandidaat om de verschillen tussen deze verschillende plakmodi te illustreren. 

Als u uw slice wilt testen, klikt u op het kleine pictogram in de rechterbovenhoek van de Slice Viewer en doorloopt u de volgende modi:

1. Groot

In dit formaat geeft Android zoveel mogelijk rijen weer in de beschikbare ruimte. Dit is de modus die Slice Viewer standaard gebruikt. 

2. Snelkoppeling

In deze modus wordt uw segment weergegeven door een pictogram en een label.

Als er een primaire header is gekoppeld aan uw SliceAction, dan zal dit worden gebruikt als het pictogram van je schijf. Als er geen pictogram beschikbaar is, geeft Android in plaats daarvan de primaire actie weer die is gekoppeld aan de eerste rij van uw segment, die in dit geval ons Kotlin-tekenbaar is. 

Als u het pictogram wilt wijzigen dat wordt weergegeven in de snelkoppelingsmodus, voegt u een tweede tekenbaar toe aan uw project en werkt u het volgende gedeelte van de slice-provider bij:  

 .addGridRow it.apply addCell it.apply addTitleText ("Java vs. Kotlin") addText ("Deel 1") // Verwijzing naar de nieuwe tekenbare // addImage (IconCompat.createWithResource (context, R.drawable.androidlogo) , ListBuilder.LARGE_IMAGE)

3. Klein

De modus Klein heeft een beperkte hoogte en geeft een enkele weer SliceItem of een beperkte verzameling items als één rij met inhoud. Als uw slice een header heeft, wordt dit weergegeven, wat precies is wat er met onze slice gebeurt. 

Het wijzigen van de titel of de ondertitel heeft invloed op de inhoud die wordt weergegeven in de kleine modus.

fun createSliceWithGridRow (sliceUri: Uri): Slice return ListBuilder (context, sliceUri, ListBuilder.INFINITY) .setHeader it.apply setTitle ("Dit is de titel") setSubtitle ("Dit is de ondertitel")

Als uw segment geen koptekst bevat, wordt de eerste rij van het segment weergegeven.  

Omlaagcode, met Slice-bouwers KTX

Zodra u hebt geleerd hoe u een nieuwe functie kunt implementeren, leert u hoe u dezelfde resultaten kunt behalen, met minder code!  

Android KTX is een verzameling modules die bestaat uit extensies die het Android-platform voor Kotlin optimaliseren. De Slice Builders KTX-module van Android KTX verpakt het bouwerspatroon in een Kotlin-vriendelijke DSL waarmee u uw plakjes op een meer beknopte, voor de mens leesbare manier kunt maken. Om aan de slag te gaan met Slice Builders KTX, vervangt u de volgende afhankelijkheid:

implementatie 'androidx.slice: slice-builders: 1.0.0-alpha3'

Met:

implementatie 'androidx.slice: slice-builders-ktx: 1.0.0-alpha3'

U kunt vervolgens uw createSlice methode om deze DSL te gebruiken. Hier is bijvoorbeeld een eenvoudig segment met een titel en een ondertitel:

import android.net.Uri import androidx.slice.Slice import androidx.slice.SliceProvider import androidx.slice.builders.ListBuilder import androidx.slice.builders.ListBuilder.INFINITY class MySliceProvider: SliceProvider () override fun onCreateSliceProvider (): Boolean return true onderdrukt plezier opBindSlice (sliceUri: Uri): Slice? val path = sliceUri.path when (path) "/ launchMainActivity" -> return createSlice (sliceUri) return null fun createSlice (sliceUri: Uri): Slice return ListBuilder (context, sliceUri, INFINITY) .addRow it .apply setTitle ("Dit is een titel") setSubtitle ("Dit is een ondertitel") .build ()

Met behulp van de DSL wordt dit: 

import android.net.Uri import androidx.slice.Slice import androidx.slice.SliceProvider import andro