תכונות API לשיפור הטיפול בשגיאות בתכונה 'בקצרה' נכללות Android מגרסה 15. בדף הזה מפורטות כמה שיטות מומלצות בנוגע לממשקי ה-API האלה.
השתמשו בבלוק 'התנסות' סביב רכיבים לא קומפוזביליים
התכונה 'פיתוח נייטיב' לא מאפשרת לנסות לתפוס בלוקים של תכנים קומפוזביליים, אבל היא מאפשרת את הלוגיקה הנוספת של האפליקציה בבלוקים האלה. כך אפשר להשתמש ב'כתיבה' בתצוגת שגיאה, כמו שאפשר לראות בדוגמה הבאה:
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)
}
}
פריסת השגיאה שמוגדרת כברירת מחדל
אם יש חריג לא זוהה או שגיאת כתיבה, התכונה 'בקצרה' תציג פריסת השגיאה שמוגדרת כברירת מחדל:
התכונה 'בקצרה' מאפשרת למפתחים לספק פריסת XML כחלופה במקרה של הרכבה נכשל. המשמעות היא שאירעה שגיאה בקוד הכתיבה. השגיאה הזו בממשק המשתמש מופיעה גם אם יש שגיאה לא ידועה בקוד האפליקציה.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)
הפריסה הזו היא פריסה סטטית שהמשתמש לא יכול ליצור איתה אינטראקציה, אבל היא טובה במקרי חירום.
הוספת פעולות לממשק המשתמש של השגיאות שמוגדר כברירת מחדל
החל מגרסה 1.1.0 של 'בקצרה', אפשר לשנות את קוד ברירת המחדל לטיפול בשגיאות. כך תוכלו להוסיף קריאות חוזרות לפעולה במקרה של חריגה שלא זוהה, או שגיאה בהרכבה.
כדי להשתמש בתכונה הזו, צריך לשנות את הפונקציה onCompositionError()
:
GlanceAppWidget.onCompositionError(
context: Context,
glanceId: GlanceId,
AppWidgetId: Int,
throwable: Throwable
)
בפונקציה הזו, במסגרת 'בקצרה' חוזרים ל-API RemoteViews
לטיפול בשגיאות.
כך אפשר לציין פריסות ורכיבי handler של פעולות באמצעות 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.");
}