תכונות API לשיפור טיפול בשגיאות ב-Glance כלולות החל מגרסה Android 15. בדף הזה מפורטות כמה שיטות מומלצות בנוגע לממשקי ה-API האלה.
שימוש בבלוק try-catch סביב רכיבים שלא ניתן לשלב
פיתוח נייטיב לא מאפשר לתפוס בלוקים של תוכן קומפוזבילי, אבל הוא מאפשר לכלול את הלוגיקה האחרת של האפליקציה בבלוקים האלה. כך תוכלו להשתמש ב-Compose בתצוגת השגיאה, כמו בדוגמה הבאה:
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)
}
}
פריסת השגיאה שמוגדרת כברירת מחדל
אם יש חריגה שלא נתפסה או שגיאה ב-Compose, ב-Glance תוצג פריסה שמוגדרת כברירת מחדל של השגיאה:
Glance מאפשר למפתחים לספק פריסה של XML כחלופה אם היצירה של התצוגה נכשלת. המשמעות היא שאירעה שגיאה בקוד הכתיבה. ממשק המשתמש של השגיאה מופיע גם אם יש שגיאה שלא תפסתם בקוד של האפליקציה.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)
זהו פריסה סטטית שהמשתמשים לא יכולים ליצור איתה אינטראקציה, אבל היא מתאימה למקרה חירום.
הוספת פעולות לממשק המשתמש של שגיאות ברירת המחדל
החל מגרסה 1.1.0 של Glance, אפשר לשנות את קוד ברירת המחדל לטיפול בשגיאות ב-Glance. כך תוכלו להוסיף קריאות חזרה לפעולות במקרה של חריגה או שגיאה שלא תפסתם בזמן היצירה.
כדי להשתמש בתכונה הזו, משנים את ברירת המחדל של הפונקציה onCompositionError()
:
GlanceAppWidget.onCompositionError(
context: Context,
glanceId: GlanceId,
AppWidgetId: Int,
throwable: Throwable
)
בפונקציה הזו, Glance חוזרת ל-API של RemoteViews
לטיפול בשגיאות.
כך אפשר לציין פריסות ורכיבי טיפול בפעולות באמצעות XML.
בדוגמאות הבאות מוסבר, שלב אחרי שלב, איך ליצור ממשק משתמש של שגיאה שכולל לחצן לשליחת משוב:
- כתיבת הקובץ 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>
- שינוי ברירת המחדל של הפונקציה
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)
}
- יצירת Intent בהמתנה שמפנה אל
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)
}
- טיפול בכוונה ב-
GlanceAppWidgetReceiver
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
Log.e("ErrorOnClick", "Button was clicked.");
}