تم تضمين ميزات واجهة برمجة التطبيقات لتحسين التعامل مع الأخطاء في ميزة "نظرة سريعة" بدءًا من الإصدار Android 15. توفّر هذه الصفحة بعض أفضل الممارسات بشأن واجهات برمجة التطبيقات هذه.
استخدام كتلة تجريبية حول المكوّنات غير القابلة للإنشاء
لا تسمح ميزة 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)
}
}
التنسيق التلقائي للأخطاء
إذا كان هناك استثناء غير معروف أو خطأ في الإنشاء، تعرض ميزة "نظرة سريعة" تنسيقًا تلقائيًا للأخطاء:
تتيح ميزة "نظرة سريعة" للمطوّرين توفير تنسيق XML كإجراء احتياطي في حال تعذّر إنشاء المحتوى. وهذا يعني أن هناك خطأ في رمز الإنشاء. تظهر واجهة مستخدم الخطأ هذه أيضًا إذا كان هناك خطأ غير معروف في رمز تطبيقك.
class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout)
هذا التخطيط عبارة عن تخطيط ثابت لا يمكن للمستخدم التفاعل معه، ولكنه جيد في حالات الطوارئ.
إضافة إجراءات إلى واجهة مستخدم الخطأ التلقائية
في الإصدار 1.1.0 من "نظرة سريعة"، تتيح لك ميزة "نظرة سريعة" إلغاء رمز معالجة الأخطاء التلقائي. بهذه الطريقة، يمكنك إضافة استدعاءات الإجراءات في حالة حدوث استثناء غير ملاحظ أو خطأ في التركيب.
لاستخدام هذه الميزة، عليك إلغاء الدالة onCompositionError()
:
GlanceAppWidget.onCompositionError(
context: Context,
glanceId: GlanceId,
AppWidgetId: Int,
throwable: Throwable
)
وفي هذه الوظيفة، تستخدم ميزة "نظرة سريعة" واجهة برمجة تطبيقات 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.");
}