Le funzionalità API per migliorare la gestione degli errori su Glance sono incluse a partire da Android 15. Questa pagina fornisce alcune best practice relative a queste API.
Utilizzare un blocco di prova intorno ai componenti non componibili
Compose non consente blocchi di prova intorno agli elementi componibili, ma consente di dall'altra logica dell'app in questi blocchi. In questo modo puoi utilizzare Compose per visualizzazione degli errori, come illustrato nell'esempio seguente:
provideContent {
var isError = false;
var data = null
try {
val repository = (context.applicationContext as MyApplication).myRepository
data = repository.loadData()
} catch (e: Exception) {
isError = true;
//handleError
}
if (isError) {
ErrorView()
} else {
Content(data)
}
}
Layout degli errori predefinito
Se si verifica un'eccezione non rilevata o un errore di Scrivi, Riepilogo mostra layout degli errori predefinito:
Il Glance consente agli sviluppatori di fornire un layout XML come riserva se per la composizione non riesce. Ciò significa che si è verificato un errore nel codice Compose. UI di questo errore viene visualizzata anche se nel codice dell'app è presente un errore non rilevato.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)
Questo layout è statico con cui l'utente non può interagire, ma è accettabile nei casi di emergenza.
Aggiungi azioni all'interfaccia utente degli errori predefinita
A partire da Glance 1.1.0, Glance consente di ignorare il codice predefinito per la gestione degli errori. In questo modo, puoi aggiungere callback di azioni nel caso di un'eccezione non rilevata o errore di composizione.
Per utilizzare questa funzionalità, sostituisci la funzione onCompositionError()
:
GlanceAppWidget.onCompositionError(
context: Context,
glanceId: GlanceId,
AppWidgetId: Int,
throwable: Throwable
)
In questa funzione, Glance utilizza l'API RemoteViews
per la gestione degli errori.
In questo modo puoi specificare layout e gestori di azioni utilizzando XML.
I seguenti esempi mostrano, passo passo, come creare un'interfaccia utente di errore che include un pulsante per inviare un feedback:
- Scrivi il file error_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Widget.MyApplication.AppWidget.Error"
android:id="@android:id/background"
android:layout_width="match_parent"
android:textSize="24sp"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/error_title_view"
android:layout_width="match_parent"
android:textColor="@color/white"
android:textFontWeight="800"
android:layout_height="wrap_content"
android:text="Example Widget Error" />
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:paddingTop="4dp"
android:layout_height="match_parent">
<ImageButton
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="center"
android:tint="@color/white"
android:id="@+id/error_icon"
android:src="@drawable/heart_broken_fill0_wght400_grad0_opsz24"
/>
<TextView
android:id="@+id/error_text_view"
android:layout_width="wrap_content"
android:textColor="@color/white"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="8dp"
android:textSize="16sp"
android:layout_weight="1"
android:text="Useful Error Message!" />
</LinearLayout>
</LinearLayout>
- Esegui l'override della funzione
onCompositionError
override fun onCompositionError(
context: Context,
glanceId: GlanceId,
AppWidgetId: Int,
throwable: Throwable
) {
val rv = RemoteViews(context.packageName, R.layout.error_layout)
rv.setTextViewText(
R.id.error_text_view,
"Error was thrown. \nThis is a custom view \nError Message: `${throwable.message}`"
)
rv.setOnClickPendingIntent(R.id.error_icon, getErrorIntent(context, throwable))
AppWidgetManager.getInstance(context).updateAppWidget(AppWidgetId, rv)
}
- Crea un intent in attesa che faccia riferimento a
GlanceAppWidgetReceiver
private fun getErrorIntent(context: Context, throwable: Throwable): PendingIntent {
val intent = Intent(context, UpgradeToHelloWorldPro::class.java)
intent.setAction("widgetError")
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
}
- Gestisci l'intent in
GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
Log.e("ErrorOnClick", "Button was clicked.");
}