پشتیبانی از صفحهکلیدهای جداشدنی به حداکثر رساندن بهرهوری کاربر در دستگاههای دارای صفحهنمایش بزرگ کمک میکند. هر بار که صفحهکلیدی به دستگاه متصل یا از آن جدا میشود، Android تغییر پیکربندی را راهاندازی میکند که میتواند باعث ازدست رفتن وضعیت رابط کاربری شود. برنامه شما میتواند وضعیت خود را ذخیره و بازیابی کند و به سیستم اجازه دهد بازآفرینی فعالیت را مدیریت کند، یا میتواند بازآفرینی فعالیت را برای تغییرات پیکربندی صفحهکلید محدود کند.
در همه موارد، همه دادههای مربوط به صفحهکلید در Configuration
شیء ذخیره میشود. فیلدهای keyboard و keyboardHidden شیء پیکربندی
حاوی اطلاعاتی درباره نوع صفحهکلید و دردسترس بودن آن است.
روالهای مطلوب
برنامههای بهینهسازیشده برای صفحهنمایشهای بزرگ از همه انواع دستگاههای ورودی، از صفحهکلیدهای نرمافزاری و سختافزاری گرفته تا قلم، موشواره، صفحه لمسی، و دیگر دستگاههای جانبی پشتیبانی میکنند.
پشتیبانی از صفحهکلیدهای خارجی شامل تغییرات پیکربندی است که میتوانید به دو روش مدیریت کنید:
- اجازه دهید سیستم فعالیت درحال اجرا را بازسازی کند و شما از مدیریت وضعیت برنامهتان مراقبت کنید.
- خودتان تغییر پیکربندی را مدیریت کنید (فعالیت بازآفرینی نخواهد شد):
- اعلام کردن همه مقادیر پیکربندی مربوط به صفحهکلید
- ایجاد کنترلکننده تغییر پیکربندی
برنامههای بهرهوری که اغلب برای وارد کردن نوشتار و ورودیهای دیگر به کنترل دقیق واسط کاربر نیاز دارند، میتوانند از رویکرد خودکارسازی برای مدیریت تغییرات پیکربندی بهرهمند شوند.
در موارد خاص، ممکن است بخواهید چیدمان برنامهتان را وقتی صفحهکلید سختافزاری متصل یا جدا میشود تغییر دهید، برای مثال، فضای بیشتری برای ابزارها یا پنجرههای ویرایش ایجاد کنید.
در Jetpack Compose، میتوانید به دو روش به تغییرات پیکربندی صفحهکلید واکنش نشان دهید:
- میانای کاربر واکنشگرا: وضعیت پیکربندی فعلی را مستقیماً در
Composables بااستفاده از
LocalConfiguration.currentبخوانید. وقتی صفحهکلید متصل یا جدا میشود، واسط کاربر بهطور خودکار بازآرایی میشود تا با وضعیت جدید سازگار شود. - بازخوانی عوارض جانبی: از
DisposableEffectآگاه از چرخه حیات برای ثبت شنونده تغییر پیکربندی در «فعالیت» میزبان استفاده کنید، که به شما امکان میدهد رویدادهای غیررابط کاربری (مثل گزارشگیری یا تجزیهوتحلیل) را بدون بازآفرینی فعالیت یا نمونهسازی عناصر نمای ساختگی راهاندازی کنید.
مواد تشکیلدهنده
android:configChanges: مشخصه عنصر<activity>مانیفست برنامه. سیستم را از تغییرات پیکربندی که برنامه مدیریت میکند مطلع میکند.LocalConfiguration: ارائهدهنده محلی ترکیبی کهConfigurationدستگاه فعلی را آشکار میکند.DisposableEffect: Compose side-effect API که وقتی یک Composable وارد ترکیب میشود، یک بلوک کد را اجرا میکند و وقتی از آن خارج میشود، آن را پاک میکند.
قدمها
مشخصه configChanges را اعلام کنید و مقادیر مربوط به صفحهکلید را اضافه کنید تا از
بازآفرینی فعالیت جلوگیری شود. سپس، از LocalConfiguration.current برای
تطبیق پویا دادن چیدمان «ترکیبی» خود استفاده کنید، یا بااستفاده از DisposableEffect، شنونده پیکربندی ثبت کنید.
۱. اعلام کردن مشخصه configChanges
عنصر <activity> را در مانیفست برنامه با افزودن مقادیر
keyboard|keyboardHidden به فهرست تغییرات پیکربندی ازقبل مدیریتشده بهروز کنید:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
۲. پاسخ به تغییرات پیکربندی صفحهکلید
برای مدیریت تغییرات پیکربندی در Jetpack Compose، بسته به اینکه درحال بهروزرسانی میانای کاربر هستید یا درحال اجرای یک تماس برگشتی با اثر جانبی، از یکی از گزینههای زیر استفاده کنید:
گزینه A: میانای کاربر واکنشگرا (توصیهشده)
نوع صفحهکلید را مستقیماً از
LocalConfiguration.currentبخوانید. وقتی صفحهکلید سختافزاری متصل یا جدا میشود، این مقدار تغییر میکند و Compose بهطور خودکار رابط کاربری شما را بازسازی میکند.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
گزینه B: شنونده عوارض جانبی
اگر نیاز دارید وقتی پیکربندی تغییر میکند، اثر جانبی اجرا کنید (مثل ثبت گزارش، بهروزرسانی پایگاه داده محلی، یا راهاندازی تجزیهوتحلیل)، از
DisposableEffectبرای ثبت شنونده تغییر پیکربندی در میزبانComponentActivityاستفاده کنید.val context = LocalActivity.current DisposableEffect(context) { val activity = context as? ComponentActivity val listener = Consumer<Configuration> { newConfig -> val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY // Trigger non-UI actions, analytics, etc. } activity?.addOnConfigurationChangedListener(listener) onDispose { activity?.removeOnConfigurationChangedListener(listener) } }
نتایج
برنامهتان اکنون بدون بازآفرینی فعالیت درحال اجرا، به متصل یا جدا شدن صفحهکلید خارجی پاسخ میدهد.
منابع بیشتر
برای آشنایی با نحوه ذخیره کردن وضعیت میانای کاربر برنامه درطول تغییرات پیکربندی مثل اتصال یا جدا کردن صفحهکلید، ذخیره وضعیتهای میانای کاربر را ببینید.